flutter 中的 runZonedGuarded

MUH*_*C P 9 android dart flutter bloc

// 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),
  );
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个代码片段,我只是对 runZonedGuarded() 和 bootstrap(FutureOr Function() builder) 感到困惑。该代码由very_good CLI生成,它将为flutter应用程序创建一个入门样板。

Mat*_*ias 9

Future<void> bootstrap(FutureOr<Widget> Function() builder) async { ...

正在定义一个名为 的函数bootstrap。该函数采用一个名为 builder 的参数,它是

  • 不带参数的函数
  • 返回 Future 或 Widget

并且它将异步执行(构建器可能会也可能不会异步执行)。

Bloc.observer = AppBlocObserver();是观察应用程序块正在执行的操作的一种已弃用的方法。定义AppBlocObserver了一系列回调,这些回调将在“事件”被触发时执行,例如error、 和change

对于BLoC- 库的版本 >= 8.0 ,您可能应该执行如下操作,而不是问题中的运行区域保护后置,因为它们移动了 bloc 观察者属性。

runZonedGuarded(
  () => BlocOverrides.runZoned(
    () async => runApp(await builder()), 
    blocObserver: AppBlocObserver()
  ),
  (error, stackTrace) => log(error.toString(), stackTrace: stackTrace));
Run Code Online (Sandbox Code Playgroud)

这个“构建器”方法可能是一个异步方法(或者不是),然后将被执行,返回的小部件将成为runApp的参数- 女巫将执行

膨胀给定的小部件并将其附加到屏幕。

然后该应用程序将在错误区域中运行,其中有趣的部分是

onError 函数既用于通过重写 zoneSpecification 中的 ZoneSpecification.handleUncaughtError(如果有)来处理异步错误,又用于处理调用 body 同步引发的错误。

  • **更新:** `Bloc.observer` 在 8.1.0 中重新引入,并且 `BlocOverrides` 已弃用。 (3认同)