runAppWithInitHandler function

void runAppWithInitHandler(
  1. FutureOr<Widget> builder(
    1. NavigatorObserver
    ), {
  2. bool enableReplaceDefaultErrorWidget = true,
  3. BindingInitHandler? bindingInitHandler,
  4. VeApmErrorFilter? errorFilter,
  5. void initHandler()?,
})

Implementation

void runAppWithInitHandler(FutureOr<Widget> Function(NavigatorObserver) builder,
    {bool enableReplaceDefaultErrorWidget = true,
    BindingInitHandler? bindingInitHandler,
    VeApmErrorFilter? errorFilter,
    void Function()? initHandler}){
  runZonedGuarded(() async {
    // 3.0 以后初始化前不能直接调用 instance,会抛 null check 异常
    // assert(WidgetsBinding.instance == null, 'Please call runTraceApp() first in main().');

    // for monitor app launch fp cost, start
    // AppContext.instance.launchStartTime = DateTime.now().millisecondsSinceEpoch;

    // 单独使用APM时初始化WidgetsFlutterBinding
    if (bindingInitHandler != null) {
      bindingInitHandler();
      assert(ApmWidgetsFlutterBinding.isInit, 'Please make your custom binding extends ApmWidgetsFlutterBinding.');
    } else {
      ApmWidgetsFlutterBinding.ensureInitialized();
    }

    // 创建根widget,和OneKit结合使用时,包括了WidgetsFlutterBinding的初始化
    final Widget rootWidget = await builder(ApmNavigatorObserver.instance);

    if (errorFilter != null) {
      ApmErrorTrace.instance.veApmErrorFilter = errorFilter;
    }

    final FlutterExceptionHandler? _origErrorHandler = FlutterError.onError;
    FlutterError.onError = (FlutterErrorDetails details) {
      logRelease('method: runTraceApp, step: Zone.current.handleUncaughtError');
      Zone.current.handleUncaughtError(details, StackTrace.current);
      _origErrorHandler?.call(details);
    };

    if (enableReplaceDefaultErrorWidget) {
      ApmErrorTrace.instance.replaceErrorWidget();
    }
    // for monitor app launch fp cost, end
    // WidgetsBinding.instance.addPostFrameCallback((Duration callback) {
    //   AppContext.instance.appFpFinished();
    // });
    // for monitor auto fps
    WidgetsBinding.instance.addObserver(ApmWidgetsBindingObserver());
    // execute biz code
    runApp(rootWidget);

    if (initHandler != null) {
          initHandler();
    }
  }, (Object exception, StackTrace stack) {
    veApmExceptionHandler(exception, stack);
  });
}