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 定义了一堆回调,这些回调将在触发“事件”时执行,例如 errorchange.

版本 >= 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.