flutter 平台调度程序.示例.onError与runZonedGuard

bxjv4tth  于 2023-01-21  发布在  Flutter
关注(0)|答案(1)|浏览(232)

有谁能解释一下(或者提供一个解释文档的链接)什么时候我必须使用PlatformDispatcher.instance.onError,什么时候runZonedGuarded?据我所知,它们都是关于处理异步异常的。

ecbunoof

ecbunoof1#

我也在寻找同一个问题的答案,我想我已经找到了一个令人满意的答案:

选项#1平台调度程序.示例. onError

https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/onError.html
https://firebase.google.com/docs/crashlytics/get-started?platform=flutter中的示例

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

但是https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/instance.html的一句重要名言
考虑避免通过PlatformDispatcher. instance静态引用此单例,而更倾向于使用绑定进行依赖性解析,如WidgetsBinding.instance.platformDispatcher。
静态访问这个对象意味着Flutter在测试中几乎没有伪造或模仿给定对象的选项。即使Dart提供了特殊的语言构造来强制隐藏这些属性,这些机制也只适用于测试,而对于Flutter的未来来说,我们在运行时合理地选择一个合适的实现是不合理的。
widgetsBinding. instance. platformDispatcher唯一不合适的地方是,在通过调用runApp()或WidgetsFlutterBinding. instance. ensureInitialized()初始化绑定之前,需要访问这些API。在这种情况下,有必要(尽管很不幸)静态使用PlatformDispatcher. instance对象。

选项#2运行分区保护

https://api.dart.dev/stable/2.18.7/dart-async/runZonedGuarded.html
我们也有另一个选项,在你的问题,这是用在非常好的cli。

Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
  FlutterError.onError = (details) {
    log(details.exceptionAsString(), stackTrace: details.stack);
  };

  Bloc.observer = AppBlocObserver();

  await runZonedGuarded(
    () async => runApp(await builder()),
    (error, stackTrace) => log(error.toString(), stackTrace: stackTrace),
  );
}

不幸的是,如果你在runZonedGuarded方法之外使用WidgetsFlutterBinding.ensureInitialized();,这就不起作用了。所以请记住这一点。
https://github.com/firebase/flutterfire/issues/6964#issuecomment-915935180
https://github.com/flutter/flutter/issues/48972

结论

由于文档指出PlatformDispatcher.instance的使用是不幸的,我想我们可以得出结论,使用runZonedGuarded是更好的选择。
一如既往地做你自己的研究/测试,根据你的需要选择选项。

相关问题