runAppWithInitHandler function
void
runAppWithInitHandler(
- FutureOr<
Widget> builder(), { - bool enableReplaceDefaultErrorWidget = true,
- BindingInitHandler? bindingInitHandler,
- VeApmErrorFilter? errorFilter,
- 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);
});
}