虽然闲鱼的flutter-boost已经将原生和flutter的关系拉近,配置起来也很方便,但是也需要知道其中的原理
package org.devio.`as`.proj.common.flutterimport com.alibaba.android.arouter.launcher.ARouterimport io.flutter.embedding.engine.FlutterEngineimport io.flutter.plugin.common.MethodCallimport io.flutter.plugin.common.MethodChannelclass HiFlutterBridge : IHIBridge<Any?, MethodChannel.Result>, MethodChannel.MethodCallHandler {private var methodChannels = mutableListOf<MethodChannel>()companion object {@JvmStaticvar instance: HiFlutterBridge? = nullprivate set@JvmStaticfun init(flutterEngine: FlutterEngine): HiFlutterBridge {val methodChannel = MethodChannel(flutterEngine.dartExecutor, "HiFlutterBridge")if (instance == null) {HiFlutterBridge().also { instance = it }}// 单利模式 保存methodChannelmethodChannel.setMethodCallHandler(instance)instance!!.apply {methodChannels.add(methodChannel)}return instance!!}}fun fire(method: String, arguments: Any?) {methodChannels.forEach {it.invokeMethod(method, arguments)}}fun fire(method: String, arguments: Any?, callBack: MethodChannel.Result) {methodChannels.forEach {it.invokeMethod(method, arguments, callBack)}}override fun onBack(p: Any?) {//}override fun gotoNative(p: Any?) {if (p is Map<*, *>) {val action = p["action"]if (action == "goToDetail") {val goodsId = p["goodsId"]ARouter.getInstance().build("/detail/main").withString("goodsId", goodsId as String).navigation()}}}override fun getHeaderParams(callBack: MethodChannel.Result) {//}override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {when (call.method) {"onBack" -> onBack(call.arguments)"gotoNative" -> gotoNative(call.arguments)"getHeaderParams" -> getHeaderParams(result)else -> result.notImplemented()}}}
import 'package:flutter/services.dart';class HiFlutterBridge {static HiFlutterBridge _instance = HiFlutterBridge._();MethodChannel _bridge = const MethodChannel("HiFlutterBridge");var _listeners = {};HiFlutterBridge._() {_bridge.setMethodCallHandler((MethodCall call) {String method = call.method;if (_listeners[method] != null) {return _listeners[method](call);}return null;});}static HiFlutterBridge get instance => _instance;MethodChannel get bridge => _bridge;register(String method, Function(MethodCall) callback) {_listeners[method] = callback;}unregister(String method) {_listeners.remove(method);}gotoNative(Map params) {_bridge.invokeMethod("gotoNative", params);}}
