解決方案
在FlutterBoost回調(diào)中嘶朱,注冊MethodChannel狡相。
val router = INativeRouter { context, url, urlParams, requestCode, exts ->
val assembleUrl = Utils.assembleUrl(url, urlParams)
FlutterPageRouter.openPageByUrl(context, assembleUrl, urlParams)
}
val boostLifecycleListener = object : FlutterBoost.BoostLifecycleListener {
override fun beforeCreateEngine() {
IKLog.i("FlutterComponent beforeCreateEngine")
}
override fun onEngineCreated() {
IKLog.i("FlutterComponent onEngineCreated")
MethodChannel(FlutterBoost.instance().engineProvider().dartExecutor, "").setMethodCallHandler(...)
}
override fun onPluginsRegistered() {
IKLog.i("FlutterComponent onPluginsRegistered")
}
override fun onEngineDestroy() {
IKLog.i("FlutterComponent onEngineDestroy")
FlutterPluginManager.release()
}
}
//
// AndroidManifest.xml 中必須要添加 flutterEmbedding 版本設(shè)置
//
// <meta-data android:name="flutterEmbedding"
// android:value="2">
// </meta-data>
// GeneratedPluginRegistrant 會自動生成 新的插件方式
//
// 插件注冊方式請使用
// FlutterBoost.instance().engineProvider().getPlugins().add(new FlutterPlugin());
// GeneratedPluginRegistrant.registerWith(),是在engine 創(chuàng)建后馬上執(zhí)行安寺,放射形式調(diào)用
//
val platform = FlutterBoost.ConfigBuilder(application, router)
.isDebug(BuildConfig.DEBUG)
.whenEngineStart(FlutterBoost.ConfigBuilder.FLUTTER_ACTIVITY_CREATED)
.renderMode(FlutterView.RenderMode.texture)
.lifecycleListener(boostLifecycleListener)
.build()
FlutterBoost.instance().init(platform)
解決思路
在繼承FlutterBoost之前勺远,我們注冊MethodChannel
通常是采用繼承io.flutter.app.FlutterFragmentActivity
,然后拿到FlutterView
EventChannel(flutterActivity.flutterView, mName).setStreamHandler(object: EventChannel.StreamHandler{
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
}
override fun onCancel(arguments: Any?) {
}
})
繼承FlutterBoost之后耙替,需要使用boost提供的BoostFlutterActivity
亚侠,但查看源碼并沒有FlutterView
。
解決這個問題之前俗扇,我們先看下MethodChannel
的源碼硝烂。
public MethodChannel(BinaryMessenger messenger, String name) {
this(messenger, name, StandardMethodCodec.INSTANCE);
}
看見初始化MethodChannel
第一個參數(shù)為BinaryMessenger
。
BinaryMessenger: 使用與二進制消息一起傳遞的異步消息與Flutter通信的工具铜幽。
我們Flutter提供的FlutterView
钢坦,其實就是BinaryMessenger
public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry
拿我們繼續(xù)看看這個FlutterView
實現(xiàn)了BinaryMessenger
的方法做了什么究孕。
public void send(String channel, ByteBuffer message, BinaryReply callback) {
if (!isAttached()) {
Log.d(TAG, "FlutterView.send called on a detached view, channel=" + channel);
return;
}
mNativeView.send(channel, message, callback);
}
繼續(xù)追mNativeView的源碼
@Override
@UiThread
public void send(String channel, ByteBuffer message, BinaryReply callback) {
if (!isAttached()) {
Log.d(TAG, "FlutterView.send called on a detached view, channel=" + channel);
return;
}
dartExecutor.getBinaryMessenger().send(channel, message, callback);
}
由此可見,其實是這個darExecutor在起作用爹凹。
再看DartExecutor源碼
public class DartExecutor implements BinaryMessenger
是不是恍然大悟厨诸,那么只需要從FlutterBoost中拿到DartExecutor即可。
FlutterBoost.instance().engineProvider().dartExecutor
也就是說這個darExecutor已經(jīng)在FLutterBoost中了禾酱,在Engine初始化后就產(chǎn)生了微酬。
IOS解決方案
思路同Android一致
PlatformRouterImp *router = [PlatformRouterImp new];
[FlutterBoostPlugin.sharedInstance startFlutterWithPlatform:router
onStart:^(FlutterEngine *engine) {
[FlutterMethodChannel methodChannelWithName:@"the.bridge" binaryMessenger:engine.binaryMessenger];
}];