国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter開發(fā):Error的捕獲及處理

這篇具有很好參考價值的文章主要介紹了Flutter開發(fā):Error的捕獲及處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?

前言

在上一篇文章《Flutter混合開發(fā):Android中如何啟動Flutter》中我們學(xué)習(xí)了如果在Android項目中使用Flutter,在使用過程中經(jīng)常會遇到各種錯誤,那么如何處理這些錯誤?

Flutter 框架可以捕獲運(yùn)行期間的錯誤,包括構(gòu)建期間、布局期間和繪制期間。

關(guān)于Flutter錯誤的處理包含三個部分:

  • onError:處理主線程發(fā)生的錯誤
  • ErrorWidget:錯誤發(fā)生時的展示頁面
  • Zone:處理其他異步線程中(onError無法處理)的錯誤

下面來看看如何處理。

主線程錯誤

所有 Flutter 主線程的錯誤均會被回調(diào)方法 FlutterError.onError 捕獲。默認(rèn)情況下,會調(diào)用 FlutterError.dumpErrorToConsole 方法,正如方法名表示的那樣,將錯誤轉(zhuǎn)儲到當(dāng)前的設(shè)備日志中。當(dāng)從 IDE 運(yùn)行應(yīng)用時,檢查器重寫了該方法,錯誤也被發(fā)送到 IDE 的控制臺,可以在控制臺中檢查出錯的對象。

所以捕獲這部分錯誤只需要重寫FlutterError的onError即可,如下:

import 'dart:io';
 
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
 
void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    FlutterError.dumpErrorToConsole(details);
    if (kReleaseMode)
      ... //處理線上錯誤,如統(tǒng)計上傳
  };
  runApp(MyApp());
}

上面我們重寫了FlutterError.onError,這樣就可以捕獲到錯誤,第一行代碼就是將error展示到控制臺,這樣我開發(fā)時就會在控制臺很方便的看到錯誤。下面代碼就是在線上環(huán)境下,對錯誤進(jìn)一步處理,比如統(tǒng)計上傳。

默認(rèn)錯誤頁面

當(dāng)構(gòu)建期間發(fā)生錯誤時,回調(diào)函數(shù) ErrorWidget.builder 會被調(diào)用,來生成一個新的 widget,用來代替構(gòu)建失敗的 widget。默認(rèn)情況,debug 模式下會顯示一個紅色背景的錯誤頁面, release 模式下會展示一個灰色背景的空白頁面。如下:
?Flutter開發(fā):Error的捕獲及處理

上面我們知道,構(gòu)建時發(fā)生錯誤會默認(rèn)展示一個錯誤頁面,但是這個頁面很不友好,我們可以自定義一個錯誤頁面。定義一個自定義的 error widget,以當(dāng) builder 構(gòu)建 widget 失敗時顯示,請使用 MaterialApp.builder。

class MyApp extends StatelessWidget {
...
  
  Widget build(BuildContext context) {
    return MaterialApp(
      ...
      builder: (BuildContext context, Widget widget) {
        Widget error = Text('...rendering error...');
        if (widget is Scaffold || widget is Navigator)
          error = Scaffold(body: Center(child: error));
        ErrorWidget.builder = (FlutterErrorDetails errorDetails) => error;
        return widget;
      },
    );
  }
}

在App下的builder中,自定義一個error頁面,然后賦值給ErrorWidget.builder即可。這樣再出現(xiàn)錯誤的時候就可以展示一個友好的頁面,提示用戶重啟或者升級應(yīng)用等。

異步線程錯誤

如果在調(diào)用堆棧上沒有 Flutter 回調(diào)的情況下發(fā)生錯誤(這里可以理解為FlutterError.onError僅僅可以捕獲主線程的錯誤,而其他異步線程的錯誤則需要Zone來捕獲),它們由發(fā)生區(qū)域的 Zone 處理。 Zone 在默認(rèn)情況下僅會打印錯誤,而不會執(zhí)行其他任何操作。

假設(shè)一個 onPressed 回調(diào)調(diào)用了異步方法,例如 MethodChannel.invokeMethod (或者其他 plugin 的方法):

OutlinedButton(
  child: Text('Click me!'),
  onPressed: () async {
    final channel = const MethodChannel('crashy-custom-channel');
    await channel.invokeMethod('blah');
  },
),

如果 invokeMethod 拋出了錯誤,它不會傳遞至 FlutterError.onError,而是直接進(jìn)入 runApp 的 Zone。

如果你想捕獲這樣的錯誤,請使用 runZonedGuarded。代碼如下:

import 'dart:async';
 
void main() {
  runZonedGuarded(() {
    runApp(MyApp());
  }, (Object error, StackTrace stack) {
    ... //處理錯誤
  });
}

請注意,如果你的應(yīng)用在 runApp 中調(diào)用了 WidgetsFlutterBinding.ensureInitialized() 方法來進(jìn)行一些初始化操作(例如 Firebase.initializeApp()),則必須在 runZonedGuarded 中調(diào)用 WidgetsFlutterBinding.ensureInitialized()

runZonedGuarded(() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

如果 WidgetsFlutterBinding.ensureInitialized() 在外部調(diào)用,錯誤將不會被捕獲到。

完整解決方案

所以flutter中完整的處理錯誤流程實際上是分三步的

  1. 先通過runZonedGuarded處理異步錯誤
  2. 再通過FlutterError.onError處理
    (runZonedGuarded和onError捕獲的這些錯誤可以通過一個我們自定義的MyErrorsHandler類來集中處理即可,比如統(tǒng)計上傳等。)
  3. 最后還需要自定義一個友好的錯誤頁面來取代默認(rèn)錯誤頁面。

完整代碼如下:
Flutter開發(fā):Error的捕獲及處理

總結(jié)

可以看到再處理Flutter中的Error的時候,我們要分情況進(jìn)行處理,主線程和異步線程的錯誤通過不同的方式進(jìn)行捕獲,但是處理可以統(tǒng)一。另外為了更友好的展示,可以重新定義一個錯誤頁面來替換默認(rèn)的錯誤頁面,這樣當(dāng)出錯的時候會顯示一個很友好的頁面來提示用戶。文章來源地址http://www.zghlxwxcb.cn/news/detail-400017.html

到了這里,關(guān)于Flutter開發(fā):Error的捕獲及處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • flutter 開發(fā)之 Could not build the precompiled application for the device. Error (Xcode): No profiles f

    flutter 開發(fā)之 Could not build the precompiled application for the device. Error (Xcode): No profiles f

    問題:Could not build the precompiled application for the device. Error (Xcode): No profiles for ‘com.example.ql’ were found: Xcode couldn’t find any iOS App Development provisioning profiles matching ‘com.example.ql’. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to x

    2024年02月22日
    瀏覽(27)
  • 【c語言】詳解c語言#預(yù)處理期過程 | 宏定義前言

    【c語言】詳解c語言#預(yù)處理期過程 | 宏定義前言

    c語言系列專欄:?c語言之路重點知識整合?? 創(chuàng)作不易,本篇文章如果幫助到了你,還請點贊支持一下???)!!? 主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進(jìn)步! 給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼編譯到執(zhí)

    2024年02月01日
    瀏覽(28)
  • 【C++】異常處理 ① ( 異常概念引入 | 拋出異常語法 | 捕獲異常語法 | 異常捕獲流程 | 異常處理代碼示例 )

    【C++】異常處理 ① ( 異常概念引入 | 拋出異常語法 | 捕獲異常語法 | 異常捕獲流程 | 異常處理代碼示例 )

    異常是一種 特殊的程序流控制機(jī)制 , 用于處理程序中可能出現(xiàn)的錯誤或異常情況 ; 當(dāng)程序執(zhí)行錯誤時 , 由 throw 拋出異常 , 并即跳轉(zhuǎn)到相應(yīng)的異常處理程序中 ; 如果沒有適當(dāng)?shù)漠惓L幚沓绦蛱幚碓摦惓?, 程序會崩潰終止 ; 異常與函數(shù)對比 : 函數(shù) 是一種 以 棧結(jié)構(gòu) 展開的

    2024年02月04日
    瀏覽(18)
  • Python 異常捕獲與處理

    當(dāng)我們寫程序難免遇到報錯,專業(yè)的稱呼叫做異常,行業(yè)俗語叫做bug,由于異常情況出現(xiàn)會導(dǎo)致代碼停止運(yùn)行,所以在編寫過程中要盡可能避免。 語法錯誤 這一類錯誤很好理解,相當(dāng)于你不會寫,比如用if或for的時候不知道他們怎么寫,這種情況比較夸張了,好好學(xué)過的人都

    2023年04月22日
    瀏覽(24)
  • Java 異常處理以及如何捕獲和處理多個異常

    Java 異常處理以及如何捕獲和處理多個異常

    在Java中,我們使用異常處理程序組件try,catch和finally塊來處理異常。 為了捕獲和處理異常,我們將try...catch...finally代碼塊放置在可能產(chǎn)生異常的代碼周圍。finally塊是可選的。 try...catch...finally的語法為: 可能會生成異常的代碼放在try塊中。 每個try塊后面應(yīng)緊跟著catch 或 fi

    2024年02月14日
    瀏覽(44)
  • java異常處理機(jī)制(二)之異常處理與捕獲

    java異常處理機(jī)制(二)之異常處理與捕獲

    1 Error(錯誤): 是指程序無法處理的錯誤,表示運(yùn)行應(yīng)用程序時比較嚴(yán)重的問題。大多數(shù)錯誤與代碼編寫者執(zhí)行的操作無關(guān),而表示代碼運(yùn)行時JVM(Java 虛擬機(jī))出現(xiàn)的問題。 2 異常(Exception): 是指在程序執(zhí)行時由于程序處理邏輯上的錯誤而導(dǎo)致程序中斷的一種指令流。通俗的

    2024年02月05日
    瀏覽(21)
  • C# &OpenCV 從零開發(fā)(0):前言

    C# &OpenCV 從零開發(fā)(0):前言

    由于我想換個機(jī)器視覺+運(yùn)動控制的工作,我就開始了自學(xué)機(jī)器視覺方向的技術(shù)。但是Halcon畢竟是商業(yè)化的庫,國內(nèi)用盜版還是怕被告。所以期望使用OpenCV。 OpenCV目前已知的方法的有兩個版本 Python:用起來挺簡單的,就是Python的語言不適合管理,感覺以后必定會出現(xiàn)問題,不適

    2024年01月18日
    瀏覽(63)
  • 圖片加載失敗捕獲上報及處理

    圖片加載失敗捕獲上報及處理

    前端頁面中加載最多的靜態(tài)資源之一就是圖片了,當(dāng)出現(xiàn)圖片加載失敗時,非常影響用戶體驗。這時候我們就需要對圖片是否成功加載進(jìn)行判斷,并對圖片加載失敗進(jìn)行處理。 單個捕獲 HTML 中的 img 標(biāo)簽可以綁定 onerror 監(jiān)聽,來對目標(biāo)圖片加載失敗進(jìn)行處理。 統(tǒng)一捕獲 對于

    2024年02月11日
    瀏覽(13)
  • 爬蟲異常捕獲與處理方法詳解

    爬蟲異常捕獲與處理方法詳解

    Hey!作為一名專業(yè)的爬蟲代理供應(yīng)商,我今天要和大家分享一些關(guān)于爬蟲異常捕獲與處理的方法。在進(jìn)行爬蟲操作時,我們經(jīng)常會遇到各種異常情況,例如網(wǎng)絡(luò)連接錯誤、請求超時、數(shù)據(jù)解析錯誤等等。這些異常情況可能會導(dǎo)致程序崩潰或數(shù)據(jù)丟失,因此,我們需要學(xué)會如何

    2024年02月11日
    瀏覽(22)
  • 爬蟲異常處理:異常捕獲與容錯機(jī)制設(shè)計

    爬蟲異常處理:異常捕獲與容錯機(jī)制設(shè)計

    作為一名專業(yè)的爬蟲程序員,每天使用爬蟲IP面對各種異常情況是我們每天都會遇到的事情。 在爬取數(shù)據(jù)的過程中,我們經(jīng)常會遇到網(wǎng)絡(luò)錯誤、頁面結(jié)構(gòu)變化、被反爬蟲機(jī)制攔截等問題。在這篇文章中,我將和大家分享一些關(guān)于如何處理爬蟲異常情況的經(jīng)驗和技巧。通過異常

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包