//…
//步骤1、全局单例FlutterInjector实例获取。
public static FlutterInjector instance() {
accessed = true;
if (instance == null) {
instance = new Builder().build();
}
return instance;
}
//步骤2、一般无用,该特性在配合GP市场使用,譬如SDK中FlutterPlayStoreSplitApplication的onCreate初始化。
public static void setInstance(@NonNull FlutterInjector injector) {
if (accessed) {
throw new IllegalStateException(
"Cannot change the FlutterInjector instance once it’s been "
-
"read. If you’re trying to dependency inject, be sure to do so at the beginning of "
-
“the program”);
}
instance = injector;
}
//…
//步骤3、获取FlutterLoader成员实例。
@NonNull
public FlutterLoader flutterLoader() {
return flutterLoader;
}
//步骤4、获取DeferredComponentManager实例,不分析,该特性在配合GP市场使用。
public DeferredComponentManager deferredComponentManager() {
return deferredComponentManager;
}
//步骤5、常规的构造器模式。
public static final class Builder {
private FlutterLoader flutterLoader;
private DeferredComponentManager deferredComponentManager;
//…
private void fillDefaults() {
if (flutterLoader == null) {
//步骤6、实例化一个FlutterLoader。
flutterLoader = new FlutterLoader();
}
// DeferredComponentManager’s intended default is null.
}
public FlutterInjector build() {
fillDefaults();
return new FlutterInjector(flutterLoader, deferredComponentManager);
}
}
}
可以看到,FlutterInjector 看起来只是一个全局单例的注入管理类角色,其核心还在于 FlutterInjector 和 DeferredComponentManager,由于我们不是海外市场,所以暂时不分析 DeferredComponentManager 特性,着重关注通用的 FlutterInjector 机制。
正如其注释说的,这个类的职责是在应用 APK 中查找 Flutter 资源并加载 Flutter 原生库。源码如下:
public class FlutterLoader {
//…
//步骤7、创建实例,传递FlutterJNI实例,下一小节分析FlutterJNI。
public FlutterLoader() {
this(new FlutterJNI());
}
public FlutterLoader(@NonNull FlutterJNI flutterJNI) {
this.flutterJNI = flutterJNI;
}