android - runZonedGuarded in flutter
问题描述
// Copyright (c) 2021, Very Good Ventures
// https://verygood.ventures
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'dart:async';
import 'dart:developer';
import 'package:bloc/bloc.dart';
import 'package:flutter/widgets.dart';
class AppBlocObserver extends BlocObserver {
@override
void onChange(BlocBase bloc, Change change) {
super.onChange(bloc, change);
log('onChange(${bloc.runtimeType}, $change)');
}
@override
void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
log('onError(${bloc.runtimeType}, $error, $stackTrace)');
super.onError(bloc, error, stackTrace);
}
}
Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
Bloc.observer = AppBlocObserver();
FlutterError.onError = (details) {
log(details.exceptionAsString(), stackTrace: details.stack);
};
await runZonedGuarded(
() async => runApp(await builder()),
(error, stackTrace) => log(error.toString(), stackTrace: stackTrace),
);
}
有人可以解释这个代码片段吗,我只是对 runZonedGuarded() 和 bootstrap(FutureOr Function() builder) 感到困惑。此代码由very_good CLI 生成,它将为flutter 应用程序创建一个入门样板。
解决方案
Future<void> bootstrap(FutureOr<Widget> Function() builder) async { ...
正在定义一个名为bootstrap
. 此函数接受一个名为 builder 的参数,该参数是
- 不带参数的函数
- 返回 Future 或 Widget
它将异步执行(构建器可能会或可能不会异步执行)。
这Bloc.observer = AppBlocObserver();
是一种不推荐使用的观察应用程序块正在做什么的方式。定义了一组回调,这些AppBlocObserver
回调将在“事件”被触发时执行,例如error
和change
。
使用BLoC- 库的>= 8.0 版本,您可能应该执行以下操作,而不是问题中的运行区域保护 postend,因为它们移动了 bloc 观察者属性。
runZonedGuarded(
() => BlocOverrides.runZoned(
() async => runApp(await builder()),
blocObserver: AppBlocObserver()
),
(error, stackTrace) => log(error.toString(), stackTrace: stackTrace));
这个可能是异步方法的“构建器”方法 - 或不是 - 然后将被执行,返回的小部件将成为runApp的参数- 女巫将
给给定的小部件充气并将其附加到屏幕上。
然后该应用程序将在错误区域中运行,其中有趣的部分是
onError 函数用于通过覆盖 zoneSpecification 中的 ZoneSpecification.handleUncaughtError 来处理异步错误(如果有),以及处理对 body 的调用同步抛出的错误。
推荐阅读
- c - 如何将无符号整数类型的值添加到函数参数中的数组中?
- python - 我不知道如何将 Phyton 输出列为列表
- javascript - 如何访问 req.body 的特定部分(Node JS)
- php - 每 10 行中断一次并循环获取新记录
- python - 如何从列表中拆分字符串并将它们存储到另一个列表中?
- python - 如何从其他现有列的子集创建新列?
- javascript - 如何使用javascript在html中设置特定单元格的背景颜色?
- python - Numpy 从多维数组中删除一行
- python-3.x - 如何使用 Python 3 创建 20 条染色体的初始种群
- java - 我是初学者,我正在尝试编写井字游戏,但我遇到了我不明白的错误