flutter 中的 runZonedGuarded
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
.
版本 >= 8.0 of the BLoC- library 你应该做类似下面的事情而不是问题中的 运行 zone guarded postend,因为他们移动了 bloc observer 属性.
runZonedGuarded(
() => BlocOverrides.runZoned(
() async => runApp(await builder()),
blocObserver: AppBlocObserver()
),
(error, stackTrace) => log(error.toString(), stackTrace: stackTrace));
这个 'builder' 方法可能是一个异步方法 - 或者不是 - 然后将被执行并且返回的小部件将成为 runApp 的参数 - 是要去
Inflate the given widget and attach it to the screen.
该应用程序将在 error zone 中 运行,其中有趣的部分是
The onError function is used both to handle asynchronous errors by overriding ZoneSpecification.handleUncaughtError in zoneSpecification, if any, and to handle errors thrown synchronously by the call to body.
// 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
.
版本 >= 8.0 of the BLoC- library 你应该做类似下面的事情而不是问题中的 运行 zone guarded postend,因为他们移动了 bloc observer 属性.
runZonedGuarded(
() => BlocOverrides.runZoned(
() async => runApp(await builder()),
blocObserver: AppBlocObserver()
),
(error, stackTrace) => log(error.toString(), stackTrace: stackTrace));
这个 'builder' 方法可能是一个异步方法 - 或者不是 - 然后将被执行并且返回的小部件将成为 runApp 的参数 - 是要去
Inflate the given widget and attach it to the screen.
该应用程序将在 error zone 中 运行,其中有趣的部分是
The onError function is used both to handle asynchronous errors by overriding ZoneSpecification.handleUncaughtError in zoneSpecification, if any, and to handle errors thrown synchronously by the call to body.