日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

了解并解決 Flutter 中的灰屏問(wèn)題

來(lái)源: 責(zé)編: 時(shí)間:2024-06-14 08:51:14 221觀看
導(dǎo)讀生產(chǎn)中的 flutter 應(yīng)用程序中的灰屏是一種通用占位符,當(dāng)框架遇到問(wèn)題無(wú)法渲染預(yù)期用戶界面時(shí)就會(huì)顯示。是的,所以基本上是出現(xiàn)問(wèn)題時(shí)的后備指示器。有趣的是,這只出現(xiàn)在發(fā)布模式下。在任何其他模式下運(yùn)行都會(huì)顯示紅色錯(cuò)

生產(chǎn)中的 flutter 應(yīng)用程序中的灰屏是一種通用占位符,當(dāng)框架遇到問(wèn)題無(wú)法渲染預(yù)期用戶界面時(shí)就會(huì)顯示。是的,所以基本上是出現(xiàn)問(wèn)題時(shí)的后備指示器。yrP28資訊網(wǎng)——每日最新資訊28at.com

有趣的是,這只出現(xiàn)在發(fā)布模式下。在任何其他模式下運(yùn)行都會(huì)顯示紅色錯(cuò)誤屏幕,并說(shuō)明導(dǎo)致錯(cuò)誤的原因。(檢查此處以了解各種類(lèi)型的構(gòu)建模式。)此類(lèi)錯(cuò)誤的常見(jiàn)原因是:yrP28資訊網(wǎng)——每日最新資訊28at.com

  • 未處理的異常:這些是運(yùn)行時(shí)發(fā)生的錯(cuò)誤,未使用 try-catch 塊捕獲。
  • 渲染錯(cuò)誤:這些是渲染布局時(shí)引起的問(wèn)題,例如,在 Column 、 Row 或 Flex 小部件外部使用 Expanded 時(shí)引起的問(wèn)題。

以下是可能導(dǎo)致灰屏的代碼示例:yrP28資訊網(wǎng)——每日最新資訊28at.com

class HomeView extends HookWidget {  const HomeView({super.key});  @override  Widget build(BuildContext context) {    const widget = null;    return Scaffold(      appBar: AppBar(        title: Text(          'Gallery',          style: Theme.of(context).textTheme.headlineLarge,        ),      ),      body: widget!,    );  }}

在這里,我們犯了一個(gè)明顯的錯(cuò)誤,在我們知道的 null 小部件上使用了 bang 運(yùn)算符(!),這導(dǎo)致在非發(fā)布模式下出現(xiàn)紅屏,在發(fā)布模式下出現(xiàn)灰屏。yrP28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,我們不建議在不更新的情況下將部件明確設(shè)置為空值,空值錯(cuò)誤是一個(gè)常見(jiàn)錯(cuò)誤,而上述操作是重現(xiàn)該錯(cuò)誤的簡(jiǎn)單方法。yrP28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片yrP28資訊網(wǎng)——每日最新資訊28at.com

調(diào)試模式下的紅色錯(cuò)誤屏幕(左)和發(fā)布模式下的灰色屏幕(右)的圖像調(diào)試模式下的紅色錯(cuò)誤屏幕(左)和發(fā)布模式下的灰色屏幕(右)的圖像yrP28資訊網(wǎng)——每日最新資訊28at.com

自定義錯(cuò)誤屏幕

為了顯示更用戶友好的消息而不是灰屏,我們將策略性地在 main 函數(shù)中放置一行代碼。該行充當(dāng)預(yù)防措施,確保每當(dāng)發(fā)生未處理的異常時(shí)都會(huì)顯示自定義錯(cuò)誤屏幕。yrP28資訊網(wǎng)——每日最新資訊28at.com

void main() {  ErrorWidget.builder = (_) => const AppErrorWidget(); // This line does the magic!  runApp(MyApp());}

有條件的紅屏(可選):

也許您希望在開(kāi)發(fā)過(guò)程中看到默認(rèn)的紅色錯(cuò)誤屏幕以進(jìn)行調(diào)試。您可以通過(guò)將 ErrorWidget.builder 賦值包裝在檢查當(dāng)前構(gòu)建模式的 if 語(yǔ)句中來(lái)實(shí)現(xiàn)此目的:yrP28資訊網(wǎng)——每日最新資訊28at.com

void main() {  if (kReleaseMode) ErrorWidget.builder = (_) => const AppErrorWidget();  runApp(MyApp());}

下一步涉及創(chuàng)建 AppErrorWidget 本身的內(nèi)容。該小部件將確定發(fā)生未處理的異常時(shí)用戶看到的內(nèi)容。yrP28資訊網(wǎng)——每日最新資訊28at.com

class AppErrorWidget extends StatelessWidget {  const AppErrorWidget({super.key});  @override  Widget build(BuildContext context) {    return const Material(      color: Colors.white,      child: Padding(        padding: EdgeInsets.all(24),        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          mainAxisSize: MainAxisSize.min,          children: [            Icon(              Icons.warning,              size: 200,              color: Colors.amber,            ),            SizedBox(height: 48),            Text(              'So... something funny happened',              textAlign: TextAlign.center,              style: TextStyle(                fontSize: 24,                fontWeight: FontWeight.bold,              ),            ),            SizedBox(height: 16),            Text(              'This error is crazy large it covers your whole screen. But no worries'              ' though, we/'re working to fix it.',              textAlign: TextAlign.center,              style: TextStyle(                fontSize: 16,              ),            ),          ],        ),      ),    );  }}

AppErrorWidget 小部件的結(jié)果顯示AppErrorWidget 小部件的結(jié)果顯示yrP28資訊網(wǎng)——每日最新資訊28at.com

雖然鼓勵(lì)自定義應(yīng)用程序的體驗(yàn),但 ErrorWidget.builder 上的 Flutter 文檔提醒我們,調(diào)用錯(cuò)誤小部件時(shí)視圖處于不穩(wěn)定狀態(tài)。構(gòu)建(可能還有布局)期間的異常會(huì)使系統(tǒng)處于脆弱狀態(tài)。為了最大限度地減少進(jìn)一步的問(wèn)題,返回的小部件應(yīng)該做最少的工作。LeafRenderObjectWidget (如默認(rèn)的 RenderErrorBox )非常適合處理意外約束。yrP28資訊網(wǎng)——每日最新資訊28at.com

ErrorWidget.builder 的幕后花絮

現(xiàn)在我們知道,當(dāng)渲染預(yù)期 UI 的過(guò)程中發(fā)生錯(cuò)誤時(shí), ErrorWidget.builder 就會(huì)被調(diào)用,但是這到底是如何實(shí)現(xiàn)的呢?yrP28資訊網(wǎng)——每日最新資訊28at.com

如果我們深入研究 Flutter 的框架,我們會(huì)在構(gòu)建或重建小部件時(shí)看到一個(gè)名為 _updateChild() 的方法。yrP28資訊網(wǎng)——每日最新資訊28at.com

void _updateChild() {  try {    final Widget child = (widget as _RawView).builder(this, _effectivePipelineOwner);    _child = updateChild(_child, child, null);  } catch (e, stack) {    final FlutterErrorDetails details = FlutterErrorDetails(      exception: e,      stack: stack,      library: 'widgets library',      context: ErrorDescription('building $this'),      informationCollector: !kDebugMode ? null : () => <DiagnosticsNode>[        DiagnosticsDebugCreator(DebugCreator(this)),      ],    );    FlutterError.reportError(details);    final Widget error = ErrorWidget.builder(details);    _child = updateChild(null, error, slot);  }}

我們可以看到 ErrorWidget.builder 屬性用于根據(jù)提供的 FlutterErrorDetails 檢索自定義錯(cuò)誤小部件;然后更新 _child 變量以顯示自定義錯(cuò)誤小部件而不是原始子小部件。yrP28資訊網(wǎng)——每日最新資訊28at.com

提升開(kāi)發(fā)者體驗(yàn)

定制向用戶呈現(xiàn)錯(cuò)誤的方式是改善用戶體驗(yàn)的關(guān)鍵一步。雖然 ErrorWidget.builder 幫助我們?cè)诔霈F(xiàn)錯(cuò)誤時(shí)管理用戶體驗(yàn),但它并沒(méi)有為生產(chǎn)環(huán)境中的開(kāi)發(fā)人員提供有價(jià)值的見(jiàn)解。本地調(diào)試不再是一種選擇,那么我們?nèi)绾渭皶r(shí)了解用戶設(shè)備上發(fā)生的錯(cuò)誤呢?yrP28資訊網(wǎng)——每日最新資訊28at.com

這就是我們利用 FlutterError.onError 回調(diào)的力量的地方。讓我們看看這是如何完成的:yrP28資訊網(wǎng)——每日最新資訊28at.com

void main() {  if (kReleaseMode) ErrorWidget.builder = (_) => const AppErrorWidget();  FlutterError.onError = (details) {    FlutterError.dumpErrorToConsole(details);    if (!kReleaseMode) return;    // 發(fā)送到您的 crashlytics 服務(wù)...  };  runApp(MyApp());}

我們添加了一行新代碼,它將新的回調(diào)函數(shù)分配給 FlutterError.onError 屬性。每當(dāng)使用 FlutterError.reportError 報(bào)告錯(cuò)誤時(shí)都會(huì)調(diào)用此回調(diào)。yrP28資訊網(wǎng)——每日最新資訊28at.com

在回調(diào)內(nèi)部, FlutterError.dumpErrorToConsole(details) 通過(guò)將錯(cuò)誤詳細(xì)信息轉(zhuǎn)儲(chǔ)到控制臺(tái)來(lái)幫助我們了解幕后情況。這對(duì)于在部署或分階段部署期間可能存在對(duì)用戶設(shè)備的訪問(wèn)受限的調(diào)試目的非常有用。yrP28資訊網(wǎng)——每日最新資訊28at.com

最后的注釋行 ( // 發(fā)送到您的 crashlytics 服務(wù)... ) 強(qiáng)調(diào)了這種方法的真正威力。在這里,您可以集成您選擇的錯(cuò)誤報(bào)告服務(wù)(例如 Crashlytics)以發(fā)送詳細(xì)的錯(cuò)誤報(bào)告以供分析。yrP28資訊網(wǎng)——每日最新資訊28at.com

注意:此行包含在 if 語(yǔ)句中,以確保它僅在調(diào)試或分析模式下執(zhí)行 ( !kReleaseMode )。yrP28資訊網(wǎng)——每日最新資訊28at.com

避免灰屏的最佳錯(cuò)誤處理實(shí)踐

我們已經(jīng)了解了導(dǎo)致灰屏的原因以及出現(xiàn)灰屏?xí)r如何更好地處理它;我們還應(yīng)該介紹的一件事是,作為開(kāi)發(fā)人員可以采取哪些措施來(lái)避免出現(xiàn)灰屏。其中一些是:yrP28資訊網(wǎng)——每日最新資訊28at.com

  • 擁抱 try-catch :將關(guān)鍵代碼部分包裝在 try-catch 塊內(nèi)。這允許您捕獲潛在的異常并提供優(yōu)雅的回退機(jī)制。
  • **少用 Bang 運(yùn)算符 (!)**:bang 運(yùn)算符 (!) 是 null 斷言檢查的快捷方式,但如果用于不確定是否為非 null 的值,可能會(huì)導(dǎo)致意外錯(cuò)誤。更多地使用條件表達(dá)式 (??) 或 null 感知訪問(wèn)運(yùn)算符 (?.)。
  • 徹底的應(yīng)用程序測(cè)試:結(jié)合使用單元、小部件、集成和手動(dòng)測(cè)試來(lái)幫助在問(wèn)題出現(xiàn)在生產(chǎn)中之前識(shí)別和解決問(wèn)題。
  • 尊重 Widget 約束:Flutter 中的每個(gè) Widget 都有局限性和預(yù)期的使用模式;避免在其限制之外使用它們,例如在可滾動(dòng)視圖中使用 Spacer 。

結(jié)論:擁抱不可避免的事情

錯(cuò)誤處理是任何編寫(xiě)良好的 Flutter 應(yīng)用程序的重要組成部分。當(dāng)您努力編寫(xiě)干凈的代碼并預(yù)測(cè)潛在問(wèn)題時(shí),異常情況必然會(huì)發(fā)生。通過(guò)實(shí)施 ErrorWidget.builder ,您可以確保即使發(fā)生意外情況,您的用戶也會(huì)看到清晰且內(nèi)容豐富的消息,而不是令人困惑的灰屏,并且通過(guò) FlutterError.onError 您可以確保您記錄這些意外錯(cuò)誤,并且可以更輕松地調(diào)試和修復(fù)這些錯(cuò)誤。yrP28資訊網(wǎng)——每日最新資訊28at.com

請(qǐng)記住,即使面對(duì)不可預(yù)見(jiàn)的障礙,一點(diǎn)準(zhǔn)備對(duì)于保持積極的用戶和開(kāi)發(fā)人員體驗(yàn)也大有幫助。yrP28資訊網(wǎng)——每日最新資訊28at.com

原文:https://medium.com/@LordChris/understanding-and-addressing-the-grey-screen-in-flutter-5e72c31f408fyrP28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93688-0.html了解并解決 Flutter 中的灰屏問(wèn)題

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 生成式人工智能是 DevSecOps 的福音還是噩夢(mèng)?

下一篇: 為什么很多人用Java好幾年,還是不太理解泛型?

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久亚洲私人国产精品va| 亚洲淫性视频| 国产一区二区久久| 欧美日韩色一区| 欧美日韩一区二区免费在线观看| 欧美三级特黄| 国产亚洲欧美日韩精品| 亚洲第一色中文字幕| 99精品视频免费观看| 亚洲欧美制服中文字幕| 久久天堂成人| 欧美日韩精品三区| 国产色综合网| 亚洲日本成人| 精品福利免费观看| 日韩午夜在线播放| 欧美一级大片在线免费观看| 久久在线播放| 国产精品qvod| **欧美日韩vr在线| 亚洲尤物视频在线| 亚洲视频在线播放| 久久久久久午夜| 欧美日韩在线播放| 国模一区二区三区| 一区二区亚洲| 亚洲福利在线看| 亚洲一区二区3| 免费亚洲一区| 欧美色精品在线视频| 精品1区2区| 亚洲一区观看| 欧美高清免费| 韩国精品主播一区二区在线观看| 一区二区激情| 免费成人av| 国产一区二区日韩精品欧美精品| 日韩写真视频在线观看| 久久久久欧美精品| 国产精品美女xx| 国产区精品在线观看| 亚洲日本久久| 久久亚洲精品视频| 国产精品自在欧美一区| 国内自拍一区| 亚洲性人人天天夜夜摸| 免费观看日韩av| 国产亚洲精品一区二区| 亚洲视频在线观看视频| 欧美国产日韩精品| 在线观看成人一级片| 欧美一区二区国产| 国产精品久久久久影院色老大| 亚洲人成网站在线观看播放| 亚洲图片在线观看| 欧美/亚洲一区| 激情五月婷婷综合| 久久激情婷婷| 欧美伦理91i| 国产精品久久久久毛片大屁完整版 | 性做久久久久久久免费看| 欧美日韩精品久久| 亚洲国产三级在线| 久久婷婷蜜乳一本欲蜜臀| 国产精品欧美激情| 亚洲在线国产日韩欧美| 欧美午夜片欧美片在线观看| 99国产一区| 欧美日韩国产成人高清视频| 亚洲精品乱码久久久久久蜜桃91| 麻豆精品一区二区综合av| 激情综合电影网| 久久久久久伊人| 激情六月综合| 久久露脸国产精品| 加勒比av一区二区| 久久一区二区三区超碰国产精品| 国内精品一区二区三区| 久久精品国产久精国产一老狼| 国产视频精品xxxx| 久久er精品视频| 国内自拍一区| 久久亚裔精品欧美| 亚洲电影激情视频网站| 蜜桃av久久久亚洲精品| 亚洲全黄一级网站| 欧美精品久久一区| 一区二区三区欧美| 国产精品毛片大码女人| 亚洲女人天堂av| 国产日韩专区| 久久视频在线看| 国产伦精品一区二区三区照片91| 亚洲一区二区三区免费观看| 欧美午夜激情视频| 亚洲欧美春色| 国产日产欧产精品推荐色| 欧美一区二区三区播放老司机| 欧美日韩在线播放一区| 亚洲视频欧洲视频| 国产精品综合av一区二区国产馆| 欧美亚洲综合在线| 精品动漫3d一区二区三区免费| 久久综合网色—综合色88| 亚洲国产成人精品视频| 欧美人妖在线观看| 亚洲你懂的在线视频| 国内成+人亚洲| 欧美丰满高潮xxxx喷水动漫| 一本一本久久a久久精品综合妖精| 国产精品美女久久久久久久| 久久国产精品久久精品国产| 亚洲第一成人在线| 欧美色视频日本高清在线观看| 午夜国产精品视频免费体验区| 精品成人国产| 欧美日韩三级一区二区| 欧美一区三区三区高中清蜜桃| 1024国产精品| 欧美午夜欧美| 久久精品99国产精品| 亚洲精品国产精品乱码不99按摩| 国产精品二区在线| 久久永久免费| 在线视频中文亚洲| 国模私拍视频一区| 欧美日韩精品久久久| 欧美一区二区视频在线观看2020| 亚洲第一精品福利| 国产精品九色蝌蚪自拍| 久久久久久夜| 一区二区三区四区五区在线| 国产一区二区福利| 欧美日韩精品二区| 久久久久成人精品免费播放动漫| 亚洲另类春色国产| 国产亚洲一区在线| 欧美日韩www| 99热在线精品观看| 国产视频久久久久| 欧美日韩成人免费| 久久不见久久见免费视频1| 亚洲精品日韩在线观看| 国产日韩高清一区二区三区在线| 欧美成人午夜77777| 香港久久久电影| 亚洲精品久久久久久一区二区| 国产精品一区二区久久久久 | 欧美不卡视频| 午夜性色一区二区三区免费视频| 亚洲黄色在线视频| 国产亚洲制服色| 欧美视频中文在线看| 美乳少妇欧美精品| 久久丁香综合五月国产三级网站| 精品成人一区二区三区| 国产精品久久国产愉拍| 欧美成人四级电影| 9色porny自拍视频一区二区| 国产亚洲在线| 国产精品二区在线| 久久黄金**| 一区二区三区成人精品| 亚洲大胆美女视频| 国产免费一区二区三区香蕉精| 欧美国产日本| 久久永久免费| 欧美综合激情网| 亚洲欧美韩国| 在线亚洲观看| 亚洲九九精品| 91久久精品www人人做人人爽| 国产一区二区精品丝袜| 国产精品欧美精品| 欧美午夜精品久久久久免费视| 欧美国产视频在线| 免费观看成人鲁鲁鲁鲁鲁视频| 久久经典综合| 欧美一区二区三区视频免费| 亚洲影院色无极综合| 亚洲精品一级| 亚洲国产另类 国产精品国产免费| 国产一区二区精品久久91| 国产日韩精品一区二区| 国产麻豆视频精品| 国产精品蜜臀在线观看| 欧美色图首页| 欧美三级在线视频| 欧美日韩在线播放三区四区| 欧美日韩成人一区| 欧美另类变人与禽xxxxx| 欧美韩国日本一区| 欧美成人国产| 欧美大色视频| 欧美激情按摩在线| 欧美高清视频| 欧美精品三级| 欧美日韩国产一区精品一区 | 永久域名在线精品| 在线不卡免费欧美| 亚洲夫妻自拍| 亚洲日本成人女熟在线观看| 亚洲激情在线激情| 亚洲精品视频在线观看网站|