有谁能解释一下(或者提供一个解释文档的链接)什么时候我必须使用PlatformDispatcher.instance.onError,什么时候runZonedGuarded?据我所知,它们都是关于处理异步异常的。
ecbunoof1#
我也在寻找同一个问题的答案,我想我已经找到了一个令人满意的答案:
https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/onError.htmlhttps://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对象。
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-915935180https://github.com/flutter/flutter/issues/48972
runZonedGuarded
WidgetsFlutterBinding.ensureInitialized();
由于文档指出PlatformDispatcher.instance的使用是不幸的,我想我们可以得出结论,使用runZonedGuarded是更好的选择。一如既往地做你自己的研究/测试,根据你的需要选择选项。
PlatformDispatcher.instance
1条答案
按热度按时间ecbunoof1#
我也在寻找同一个问题的答案,我想我已经找到了一个令人满意的答案:
选项#1平台调度程序.示例. onError
https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/onError.html
https://firebase.google.com/docs/crashlytics/get-started?platform=flutter中的示例
但是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。
不幸的是,如果你在
runZonedGuarded
方法之外使用WidgetsFlutterBinding.ensureInitialized();
,这就不起作用了。所以请记住这一点。https://github.com/firebase/flutterfire/issues/6964#issuecomment-915935180
https://github.com/flutter/flutter/issues/48972
结论
由于文档指出
PlatformDispatcher.instance
的使用是不幸的,我想我们可以得出结论,使用runZonedGuarded
是更好的选择。一如既往地做你自己的研究/测试,根据你的需要选择选项。