以下内容根据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中初始化完成。