精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

了解并解決 Flutter 中的灰屏問題

開發(fā) 前端
錯誤處理是任何編寫良好的 Flutter 應(yīng)用程序的重要組成部分。當(dāng)您努力編寫干凈的代碼并預(yù)測潛在問題時,異常情況必然會發(fā)生。

生產(chǎn)中的 flutter 應(yīng)用程序中的灰屏是一種通用占位符,當(dāng)框架遇到問題無法渲染預(yù)期用戶界面時就會顯示。是的,所以基本上是出現(xiàn)問題時的后備指示器。

有趣的是,這只出現(xiàn)在發(fā)布模式下。在任何其他模式下運行都會顯示紅色錯誤屏幕,并說明導(dǎo)致錯誤的原因。(檢查此處以了解各種類型的構(gòu)建模式。)此類錯誤的常見原因是:

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

以下是可能導(dǎo)致灰屏的代碼示例:

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!,
    );
  }
}

在這里,我們犯了一個明顯的錯誤,在我們知道的 null 小部件上使用了 bang 運算符(!),這導(dǎo)致在非發(fā)布模式下出現(xiàn)紅屏,在發(fā)布模式下出現(xiàn)灰屏。

需要注意的是,我們不建議在不更新的情況下將部件明確設(shè)置為空值,空值錯誤是一個常見錯誤,而上述操作是重現(xiàn)該錯誤的簡單方法。

圖片圖片

調(diào)試模式下的紅色錯誤屏幕(左)和發(fā)布模式下的灰色屏幕(右)的圖像調(diào)試模式下的紅色錯誤屏幕(左)和發(fā)布模式下的灰色屏幕(右)的圖像

自定義錯誤屏幕

為了顯示更用戶友好的消息而不是灰屏,我們將策略性地在 main 函數(shù)中放置一行代碼。該行充當(dāng)預(yù)防措施,確保每當(dāng)發(fā)生未處理的異常時都會顯示自定義錯誤屏幕。

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

有條件的紅屏(可選):

也許您希望在開發(fā)過程中看到默認的紅色錯誤屏幕以進行調(diào)試。您可以通過將 ErrorWidget.builder 賦值包裝在檢查當(dāng)前構(gòu)建模式的 if 語句中來實現(xiàn)此目的:

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

下一步涉及創(chuàng)建 AppErrorWidget 本身的內(nèi)容。該小部件將確定發(fā)生未處理的異常時用戶看到的內(nèi)容。

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é)果顯示

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

ErrorWidget.builder 的幕后花絮

現(xiàn)在我們知道,當(dāng)渲染預(yù)期 UI 的過程中發(fā)生錯誤時, ErrorWidget.builder 就會被調(diào)用,但是這到底是如何實現(xiàn)的呢?

如果我們深入研究 Flutter 的框架,我們會在構(gòu)建或重建小部件時看到一個名為 _updateChild() 的方法。

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 檢索自定義錯誤小部件;然后更新 _child 變量以顯示自定義錯誤小部件而不是原始子小部件。

提升開發(fā)者體驗

定制向用戶呈現(xiàn)錯誤的方式是改善用戶體驗的關(guān)鍵一步。雖然 ErrorWidget.builder 幫助我們在出現(xiàn)錯誤時管理用戶體驗,但它并沒有為生產(chǎn)環(huán)境中的開發(fā)人員提供有價值的見解。本地調(diào)試不再是一種選擇,那么我們?nèi)绾渭皶r了解用戶設(shè)備上發(fā)生的錯誤呢?

這就是我們利用 FlutterError.onError 回調(diào)的力量的地方。讓我們看看這是如何完成的:

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 報告錯誤時都會調(diào)用此回調(diào)。

在回調(diào)內(nèi)部, FlutterError.dumpErrorToConsole(details) 通過將錯誤詳細信息轉(zhuǎn)儲到控制臺來幫助我們了解幕后情況。這對于在部署或分階段部署期間可能存在對用戶設(shè)備的訪問受限的調(diào)試目的非常有用。

最后的注釋行 ( // 發(fā)送到您的 crashlytics 服務(wù)... ) 強調(diào)了這種方法的真正威力。在這里,您可以集成您選擇的錯誤報告服務(wù)(例如 Crashlytics)以發(fā)送詳細的錯誤報告以供分析。

注意:此行包含在 if 語句中,以確保它僅在調(diào)試或分析模式下執(zhí)行 ( !kReleaseMode )。

避免灰屏的最佳錯誤處理實踐

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

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

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

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

請記住,即使面對不可預(yù)見的障礙,一點準備對于保持積極的用戶和開發(fā)人員體驗也大有幫助。

原文:https://medium.com/@LordChris/understanding-and-addressing-the-grey-screen-in-flutter-5e72c31f408f

責(zé)任編輯:武曉燕 來源: 獨立開發(fā)者張張
相關(guān)推薦

2018-07-03 14:20:41

AMOLED屏幕LCD屏幕APP

2011-08-11 15:23:04

iPhoneNSBundleXcode

2022-08-05 11:55:13

FlutteriOS

2009-12-25 10:24:14

2016-11-10 09:55:29

CSS

2016-02-01 23:18:58

2022-04-12 14:54:52

Rediskey

2021-01-01 09:05:50

java編碼亂碼

2021-09-16 21:22:15

Flutter系統(tǒng)

2024-08-26 11:59:35

2018-08-20 07:09:22

2010-02-04 11:38:27

ibmdwLotus

2011-08-01 15:17:17

iPhone開發(fā) 證書 簽名

2012-10-31 10:47:05

VMware

2014-02-11 09:38:44

OpenStack開源云計算

2009-07-09 09:46:55

session過期Ajax

2021-10-20 20:27:55

MySQL死鎖并發(fā)

2010-06-07 14:50:50

jsp MySQL

2010-04-07 10:42:41

Unix操作系統(tǒng)

2014-06-19 10:19:00

Winlogon組件GPO
點贊
收藏

51CTO技術(shù)棧公眾號

天天天天天天天干| 在线一区二区不卡| 国产尤物视频在线| 蜜桃久久av一区| 欧美老女人性视频| 欧美无人区码suv| 99精品国自产在线| 亚洲国产一区视频| 日韩欧美视频一区二区| www国产在线| 久热综合在线亚洲精品| 美日韩精品视频免费看| 加勒比精品视频| 亚洲精品伊人| 欧美性猛交xxxx黑人猛交| 一区二区三区四区欧美日韩| 欧美 日韩 中文字幕| 日韩电影免费在线看| 欧美成人精品xxx| 五月天综合视频| 成人爽a毛片| 欧美日本在线一区| 黄在线观看网站| 中国av在线播放| 国产欧美日本一区视频| 国内一区在线| 国产成人精品一区二三区四区五区 | 欧美18av| 亚洲午夜在线视频| 在线看视频不卡| 日韩欧美在线番号| 高清av一区二区| 国产欧美日韩高清| 日本一区二区三区精品| 亚洲无线视频| 欧美成人精品三级在线观看| 国产精品久久国产精麻豆96堂| 香蕉久久夜色精品国产使用方法| 日韩亚洲欧美在线观看| 午夜啪啪小视频| 日本电影久久久| 欧美亚洲动漫另类| 热久久精品免费视频| 免费h视频在线观看| 亚洲高清中文字幕| 亚洲精品少妇一区二区| 伊人影院在线视频| 亚洲久草在线视频| 久久免费一级片| a级影片在线观看| 亚洲精品免费在线观看| 国产高潮呻吟久久久| 米奇精品一区二区三区| 中文字幕在线不卡| 一区二区三区四区不卡| 欧美激情黑人| 1区2区3区精品视频| 亚洲激情啪啪| 九义人在线观看完整免费版电视剧| 欧美高清一级片在线观看| 日韩欧美精品在线不卡| 在线a人片免费观看视频| 中文字幕精品三区| 亚洲一二区在线| 久草中文在线| 亚洲一区二区3| 麻豆tv在线播放| 中文字幕高清在线播放| 色香蕉成人二区免费| 成年人网站大全| 成人亚洲视频| 91精品国产综合久久久久久久久久| 天天综合天天添夜夜添狠狠添| 精品国产亚洲日本| 亚洲国产成人精品久久| 偷拍夫妻性生活| 91麻豆国产自产在线观看亚洲| 久久精品国产一区| 国产在线成人精品午夜| 国产亚洲欧洲| 国产在线视频欧美| 亚洲乱码在线观看| 91色视频在线| 中文字幕制服丝袜在线| 男女免费观看在线爽爽爽视频| 午夜欧美视频在线观看 | 日本网站在线观看一区二区三区| 国产剧情日韩欧美| 成人福利小视频| 91一区二区在线| 五月天久久综合网| 国产网红女主播精品视频| 日韩欧美国产激情| 日日干日日操日日射| 丁香5月婷婷久久| 中文字幕亚洲欧美一区二区三区 | jyzzz在线观看视频| 亚洲视频综合在线| 欧洲黄色一级视频| 电影中文字幕一区二区| 亚洲精品98久久久久久中文字幕| 国产精品视频在| 亚洲无线视频| 国产日韩在线一区| 色鬼7777久久| 一区二区三区在线播放| 欧美少妇性生活视频| 亚洲专区**| 在线播放日韩专区| 日产亚洲一区二区三区| 老鸭窝一区二区久久精品| 久久99国产精品| 在线中文字幕视频观看| 欧美亚洲自拍偷拍| 91丨porny丨对白| 99久久精品费精品国产| 日本精品一区二区三区在线播放视频| 99精品视频在线播放免费| 国产农村妇女精品| 免费 成 人 黄 色| 北条麻妃在线一区二区免费播放| 日韩亚洲精品视频| 五月婷婷六月婷婷| 99麻豆久久久国产精品免费优播| 潘金莲一级淫片aaaaa免费看| 午夜日韩成人影院| 亚洲国产福利在线| 国产一级大片在线观看| 国产一区二区美女| 亚洲自拍三区| 8av国产精品爽爽ⅴa在线观看| 亚洲国产高清自拍| 国产在线拍揄自揄拍| 国产在线精品免费av| 亚洲精品美女久久7777777| 成人免费看视频网站| 亚洲国产精品大全| 久久精品国产亚洲av麻豆色欲| 极品少妇一区二区| 夜夜爽99久久国产综合精品女不卡 | 精品久久电影| 日韩免费av片在线观看| 深夜福利免费在线观看| 天天操天天综合网| 性色av蜜臀av浪潮av老女人| 黄色成人在线网站| 国产精品加勒比| 超碰在线资源| 亚洲国产成人爱av在线播放| 亚洲综合一二三| 91麻豆精东视频| 国产日韩一区二区在线| 亚洲婷婷影院| 国产精品福利观看| 在线播放麻豆| 91精品国产一区二区三区蜜臀| 网爆门在线观看| 激情伊人五月天久久综合| 中国一区二区三区| 日韩在线亚洲| 韩国福利视频一区| 天堂中文资源在线| 色88888久久久久久影院野外 | 一区二区三区久久久| 在线观看视频你懂得| 欧美日韩综合| 久久久久se| 国产精品久久久久av电视剧| 中文字幕亚洲第一| 99精品视频在线播放免费| 亚洲一二三四在线观看| 黄色性生活一级片| 日本在线不卡一区| 亚洲在线欧美| 超碰成人在线观看| 欧美中文在线字幕| 北条麻妃在线| 日韩欧美国产成人一区二区| 日本道在线观看| 国产网站一区二区三区| 极品粉嫩美女露脸啪啪| 亚洲一本二本| 麻豆av福利av久久av| 国产精品美女午夜爽爽| 乱亲女秽乱长久久久| 午夜视频福利在线观看| 色综合久久综合网| 免费在线观看a级片| av中文一区二区三区| xx欧美撒尿嘘撒尿xx| 欧美特黄a级高清免费大片a级| 蜜桃麻豆91| 国产精品777777在线播放| 777国产偷窥盗摄精品视频| 在线免费av电影| 亚洲国产精品va| 亚洲天堂手机在线| 精品久久久久久久久久久久久| 精品伦精品一区二区三区视频密桃| 国产成a人无v码亚洲福利| 日本老熟妇毛茸茸| 黄色在线成人| 一区二区视频国产| 亚洲妇女av| av资源站久久亚洲| 国产香蕉久久| 欧美亚洲成人精品| 自由的xxxx在线视频| 国产性猛交xxxx免费看久久| 好吊色一区二区三区| 欧美日韩国产综合草草| 国产美女激情视频| 亚洲一卡二卡三卡四卡 | 亚洲福利视频导航| 国产精品麻豆免费版现看视频| www.欧美日韩国产在线| 激情文学亚洲色图| 日韩av成人高清| 国内外成人免费激情视频| 欧美视频在线观看| 黄色一级片网址| 成人毛片在线| 欧美日韩亚洲一区二区三区在线观看 | 黄色一级片免费看| 亚洲视频免费观看| 精品一区二区在线观看视频| 久久久五月婷婷| 懂色av粉嫩av蜜乳av| 不卡一二三区首页| 久久发布国产伦子伦精品| 久久国产综合精品| www.com操| 免费视频最近日韩| 三级a在线观看| 日韩高清在线不卡| 无码人妻丰满熟妇区毛片| 在线一区视频| 又粗又黑又大的吊av| 亚洲午夜在线| 久久人人爽人人爽人人av| 欧美深夜福利| 欧美大黑帍在线播放| 欧美在线亚洲| 日韩欧美视频免费在线观看| 欧美91福利在线观看| 特级西西444| 欧美日韩p片| 免费拍拍拍网站| 99精品久久| 日韩欧美视频网站| 亚洲欧美日韩在线观看a三区| 91视频最新入口| 天堂av在线一区| 视色视频在线观看| 精品制服美女久久| 手机精品视频在线| 岛国精品一区二区| 中文字幕 日本| 久久久国际精品| 日韩欧美黄色网址| 国产精品传媒在线| 强行糟蹋人妻hd中文| 亚洲一区二区三区四区五区黄| 国产一级免费av| 欧美日韩在线影院| 国产乱码77777777| 制服.丝袜.亚洲.中文.综合| 国产高清精品软件丝瓜软件| 亚洲国产精品女人久久久| 青青草娱乐在线| 中文字幕欧美视频在线| 操你啦视频在线| 性欧美激情精品| 3d欧美精品动漫xxxx无尽| 国产精品久久99久久| 91精品亚洲一区在线观看| 99在线热播| 国产精品欧美三级在线观看| 亚洲一区二区三区午夜| 亚洲小说欧美另类婷婷| 天天摸天天碰天天添| 久久99久久99| 国产极品一区二区| 欧美激情一区二区三区四区 | 午夜精品久久| 成人综合视频在线| 国产一区二区三区四区五区入口 | 亚洲女同ⅹxx女同tv| 日本一级一片免费视频| 欧美午夜电影在线播放| 国精产品一品二品国精品69xx| 亚洲欧美中文字幕| a视频在线播放| 国产精品91久久久| 亚洲精品视频一二三区| 五月天亚洲综合情| 亚洲私人影院| wwwwwxxxx日本| 91在线精品秘密一区二区| 污软件在线观看| 欧美性高潮在线| www.精品视频| 色哟哟亚洲精品一区二区| 欧美sm一区| 99久久国产免费免费| 日韩欧美不卡| 无码aⅴ精品一区二区三区浪潮| 国模一区二区三区白浆| 久久久久久久久久久久| 亚洲午夜羞羞片| 97人妻精品一区二区三区动漫| 亚洲男女性事视频| 美足av综合网| 91网站免费看| 日韩欧美二区| 色婷婷综合久久久久中文字幕 | 首页欧美精品中文字幕| 美女露出粉嫩尿囗让男人桶| 亚洲天堂免费在线观看视频| 中文字幕免费视频观看| 日韩精品视频免费专区在线播放| 中文字幕伦理免费在线视频| 成人看片人aa| 91久久夜色精品国产按摩| 成人在线观看a| 91老师国产黑色丝袜在线| 国产一级一级片| 欧美v日韩v国产v| av在线下载| 成人两性免费视频| 91久久高清国语自产拍| 亚洲天堂2018av| 国产精品色噜噜| 中文字幕免费在线看| 亚洲男人天堂网站| 爱情电影社保片一区| 久久艹中文字幕| 亚洲一区二区三区高清不卡| 小毛片在线观看| 婷婷中文字幕综合| 无码精品人妻一区二区三区影院| 欧美国产极速在线| 操欧美女人视频| 成人毛片视频网站| 91亚洲精品乱码久久久久久蜜桃| 久久视频免费在线观看| 欧美精品一区二区在线观看| 欧美hdxxxxx| 激情五月综合色婷婷一区二区| 亚洲国产一区二区三区a毛片 | 中文子幕无线码一区tr| 伊人成年综合网| 色小说视频一区| av成人在线网站| 免费的一级黄色片| 成人午夜电影网站| 毛片视频网站在线观看| 亚洲欧美日韩精品久久亚洲区| 日韩不卡免费高清视频| 亚洲精品tv久久久久久久久| 精品夜夜嗨av一区二区三区| 欧美精品一级片| 日韩激情av在线播放| 3d欧美精品动漫xxxx无尽| 在线不卡视频一区二区| 国产成人精品免费一区二区| 欧美成人aaaaⅴ片在线看| 国产视频一区在线| 日韩欧美精品一区二区综合视频| 一区二区日本伦理| 国产成人免费视频网站高清观看视频| 久久一二三四区| 亚洲欧美日韩在线高清直播| 久久精品超碰| 97超碰在线人人| 国产丝袜美腿一区二区三区| 99国产成人精品| 538国产精品一区二区免费视频| 欧美色图国产精品| 久久精品一卡二卡| 欧美性20hd另类| 91精品国产综合久久久久久豆腐| www日韩av| 日韩精品一二区| 免费又黄又爽又色的视频| 国产偷亚洲偷欧美偷精品| 日韩伦理一区二区| 国产av国片精品| 中文字幕一区在线| 手机av在线免费观看| 91精品国产综合久久男男 | 亚洲免费不卡视频| 国产精品久久中文| 最新日韩在线| 久久国产高清视频| 亚洲毛茸茸少妇高潮呻吟| 国产乱码精品一区二区三区亚洲人 | 男女男精品网站| 日本少妇吞精囗交| 久久久国产成人精品|