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中初始化完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266