flutter 插件是什么时候注册的

80 阅读1分钟

背景

在插件中的 onAttachToEngine中监听,activity的生命周期方法,如onCreate方法,onStart方法 是否能监听到MainActivity的生命周期方法的调用

继而研究 MainActivity中的onCreate 方法的调用 和 onAttachToEngine 方法调用时机

所以需要研究,MainActivity 中,在什么时候,和flutterEngine 进行关联

1,插件的代码是在什么时候注册的

GeneratedPluginRegistrant.registerWith(flutterEngine)

2. FlutterActivity 中 和FlutterEngine 进行关联的方法,是在onCreate方法

protected void onCreate(@Nullable Bundle savedInstanceState) {
  switchLaunchThemeForNormalTheme();

  super.onCreate(savedInstanceState);

  if (savedInstanceState != null) {
    boolean frameworkHandlesBack =
        savedInstanceState.getBoolean(
            FlutterActivityAndFragmentDelegate.ON_BACK_CALLBACK_ENABLED_KEY);
    setFrameworkHandlesBack(frameworkHandlesBack);
  }

  delegate = new FlutterActivityAndFragmentDelegate(this);
  delegate.onAttach(this);  //此处是flutter世界和Activity进行关联的地方
  delegate.onRestoreInstanceState(savedInstanceState);

  lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);

  configureWindowForTransparency();

  setContentView(createFlutterView());

  configureStatusBarForFullscreenFlutterExperience();
}

3. 触发插件注册的方法

void onAttach(@NonNull Context context) {
  ensureAlive();
  if (flutterEngine == null) {
    setUpFlutterEngine(); //该方法会触发onAttachToEngine的方法的调用
  }

  if (host.shouldAttachEngineToActivity()) {
   
    flutterEngine.getActivityControlSurface().attachToActivity(this, host.getLifecycle());
  }

  platformPlugin = host.providePlatformPlugin(host.getActivity(), flutterEngine);
  host.configureFlutterEngine(flutterEngine);  //此处host就是FlutterActivity对象,
  //会调用FlutterActivity中的configureFlutterEngine方法
  
  isAttached = true;
}

  1. FlutterActivity 插件注册的地方
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
  if (delegate.isFlutterEngineFromHost()) {
  
    return;
  }
  GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine);
}

上面分析是手动调用的插件的方法

自动调用GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine) 方法的位置,setUpFlutterEngine方法分析

  1. setUpFlutterEngine 会创建flutterEngine对象
flutterEngine =
    group.createAndRunEngine(
        addEntrypointOptions(
            new FlutterEngineGroup.Options(host.getContext())
                .setAutomaticallyRegisterPlugins(false)
                .setWaitForRestorationData(host.shouldRestoreAndSaveState())));

2. new FlutterEngine()对象中,会自动调用插件注册的方法

localizationPlugin.sendLocalesToFlutter(context.getResources().getConfiguration());
if (automaticallyRegisterPlugins && flutterLoader.automaticallyRegisterPlugins()) {
  GeneratedPluginRegister.registerGeneratedPlugins(this);
}

其实调用的都是flutter sdk 类中的类

import io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister;

该类通过反射,调用项目当前生成的GeneratedPluginRegister类

public static void registerGeneratedPlugins(@NonNull FlutterEngine flutterEngine) {
  try {
    Class<?> generatedPluginRegistrant =
        Class.forName("io.flutter.plugins.GeneratedPluginRegistrant");
    Method registrationMethod =
        generatedPluginRegistrant.getDeclaredMethod("registerWith", FlutterEngine.class);
    registrationMethod.invoke(null, flutterEngine);
  } catch (Exception e) {
    Log.e(
        TAG,
        "Tried to automatically register plugins with FlutterEngine ("
            + flutterEngine
            + ") but could not find or invoke the GeneratedPluginRegistrant.");
    Log.e(TAG, "Received exception while registering", e);
  }
}

flutter 项目自动生成的插件相关类 image.png