首页 > 解决方案 > 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 应用程序创建一个入门样板。

标签: androidflutterdartbloc

解决方案


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

正在定义一个名为bootstrap. 此函数接受一个名为 builder 的参数,该参数是

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

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

Bloc.observer = AppBlocObserver();是一种不推荐使用的观察应用程序块正在做什么的方式。定义了一组回调,这些AppBlocObserver回调将在“事件”被触发时执行,例如errorchange

使用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 的调用同步抛出的错误。


推荐阅读