flutter_boost初始化启动追踪

以下内容根据feature/flutter_1.9_androidx_upgrade分析整理

flutter_boost初始化都做了什么?

1:Android侧

当App启动进入了Application。在application中,我们创建了自定义的INativeRouter,并实现了自定义的页面跳转规则。接着创建了NewFlutterBoost.BoostLifeCycleListener对象,该对象提供了三个回调

public interface BoostLifecycleListener {
    void onEngineCreated(); 
    void onPluginsRegistered();
    void onEngineDestroy();
}

这三个回调见名知意。onEngineCreated是当engine创建完成的回调,flutter_boost之所以高效,就是他对每个flutterView提供了分享引擎的功能。而onPluginsRegistered()是注册plugin的时机。我们自定义的plugin都可以在这里实现。比如下面就是一个自定义的plugin:

  MethodChannel dfMethod = new MethodChannel(NewFlutterBoost.instance().engineProvider().getDartExecutor(),
                        "methodChannelName", JSONMethodCodec.INSTANCE);

再接下来我们创建了Platform,并且正式进入Flutter_boost的native端初始化。

Platform platform = new NewFlutterBoost.
                ConfigBuilder(this, router).
                isDebug(true).
              whenEngineStart(NewFlutterBoost.ConfigBuilder.ANY_ACTIVITY_CREATED).
                lifecycleListener(df).
                build();
NewFlutterBoost.instance().init(platform);

当我们来到NewFlutterBoost.init()方法之后,就会发现在该方法中提供了两种启动engine的模式。

  • 一种是立即启动模式ConfigBuilder.IMMEDIATELY。
  • 一种是有Activity的时候才启动的模式ConfigBuilder.ANY_ACTIVITY_CREATED。

我们在Application中设置的是后者。因此就来到了doInitialFlutter()。
在doInitialFlutter()中。

  • (1):初始化createEngine()。
  • (2):设置初始路由setInitialRoute(),如果没有配置就是"/"。
  • (3):配置dart代码的执行入口,并且执行
DartExecutor.DartEntrypoint entrypoint = new DartExecutor.DartEntrypoint(
                FlutterMain.findAppBundlePath(),
                "main"
        );

flutterEngine.getDartExecutor().executeDartEntrypoint(entrypoint);
  • (4):最后开始注册flutter_boost插件本身,以及我们在app中自定义的插件。
mRegistry = new BoostPluginRegistry(createEngine());
registerPlugins();

2:Flutter侧

我们在上面提到配置dart代码的入口并且执行。接下来就来到了flutter代码里面main.dart。一般我们会在initState()中注册自定义的flutter路由。

 FlutterBoost.singleton.registerPageBuilders();

然后再在MaterialApp的builder中进行flutter端的初始化

   @override
  Widget build(BuildContext context) => MaterialApp(
      title: 'Flutter Boost example',
      builder: FlutterBoost.init(),
      home: Container());

当我们给MaterialApp设置了builder之后,就相当于flutterApp的根root是FlutterBoost.init()返回的widget。当进入FlutterBoost.init()之后,该方法返回的这个widget就是BoostContainerManager,它就是一个statefulWidget。

class BoostContainerManager extends StatefulWidget 

当我们创建了一个statefulWidget之后,代码会走到该widget的State。BoostContainerManager的state也就是ContainerManagerState。他的initState()代码会紧接着执行。

  @override
  void initState() {
    super.initState();
    assert(widget.initNavigator != null);
    _onstage = BoostContainer.copy(widget.initNavigator);
    WidgetsBinding.instance.addPostFrameCallback((_) {
      setState(() {});
    });
  }

由于ContainerManagerState重写了setState(VoidCallback fn)。因此当再initState中调用了setState时,就进入了方法。

  @override
  void setState(VoidCallback fn) {
    if (SchedulerBinding.instance.schedulerPhase ==
        SchedulerPhase.persistentCallbacks) {
      SchedulerBinding.instance.addPostFrameCallback((Duration duration) {
        _refreshOverlayEntries();
      });
    } else {
      _refreshOverlayEntries();
    }
    fn();
  }

最终调用了_refreshOverlayEntries(),在该方法的倒数第二行,我们看到

_onShownContainerChanged(old, now);

在这个container显示改变的方法中进行了打印

Logger.log('onShownContainerChanged old:$old now:$now');

如果我们启动App并在logcat中过滤flutter,就可以看到下面的两行日志

flutter: Observatory listening on http://127.0.0.1:39120/Sbb7YOMU0Pg=/
flutter: FlutterBoost#onShownContainerChanged old:null now:default

而第二行日志就是在_onShownContainerChanged()中打印的。至此,flutter_boost在App中初始化完成。

你可能感兴趣的:(flutter_boost初始化启动追踪)