虽然闲鱼的flutter-boost已经将原生和flutter的关系拉近,配置起来也很方便,但是也需要知道其中的原理

    1. package org.devio.`as`.proj.common.flutter
    2. import com.alibaba.android.arouter.launcher.ARouter
    3. import io.flutter.embedding.engine.FlutterEngine
    4. import io.flutter.plugin.common.MethodCall
    5. import io.flutter.plugin.common.MethodChannel
    6. class HiFlutterBridge : IHIBridge<Any?, MethodChannel.Result>, MethodChannel.MethodCallHandler {
    7. private var methodChannels = mutableListOf<MethodChannel>()
    8. companion object {
    9. @JvmStatic
    10. var instance: HiFlutterBridge? = null
    11. private set
    12. @JvmStatic
    13. fun init(flutterEngine: FlutterEngine): HiFlutterBridge {
    14. val methodChannel = MethodChannel(flutterEngine.dartExecutor, "HiFlutterBridge")
    15. if (instance == null) {
    16. HiFlutterBridge().also { instance = it }
    17. }
    18. // 单利模式 保存methodChannel
    19. methodChannel.setMethodCallHandler(instance)
    20. instance!!.apply {
    21. methodChannels.add(methodChannel)
    22. }
    23. return instance!!
    24. }
    25. }
    26. fun fire(method: String, arguments: Any?) {
    27. methodChannels.forEach {
    28. it.invokeMethod(method, arguments)
    29. }
    30. }
    31. fun fire(method: String, arguments: Any?, callBack: MethodChannel.Result) {
    32. methodChannels.forEach {
    33. it.invokeMethod(method, arguments, callBack)
    34. }
    35. }
    36. override fun onBack(p: Any?) {
    37. //
    38. }
    39. override fun gotoNative(p: Any?) {
    40. if (p is Map<*, *>) {
    41. val action = p["action"]
    42. if (action == "goToDetail") {
    43. val goodsId = p["goodsId"]
    44. ARouter.getInstance().build("/detail/main").withString(
    45. "goodsId", goodsId as String
    46. ).navigation()
    47. }
    48. }
    49. }
    50. override fun getHeaderParams(callBack: MethodChannel.Result) {
    51. //
    52. }
    53. override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
    54. when (call.method) {
    55. "onBack" -> onBack(call.arguments)
    56. "gotoNative" -> gotoNative(call.arguments)
    57. "getHeaderParams" -> getHeaderParams(result)
    58. else -> result.notImplemented()
    59. }
    60. }
    61. }
    1. import 'package:flutter/services.dart';
    2. class HiFlutterBridge {
    3. static HiFlutterBridge _instance = HiFlutterBridge._();
    4. MethodChannel _bridge = const MethodChannel("HiFlutterBridge");
    5. var _listeners = {};
    6. HiFlutterBridge._() {
    7. _bridge.setMethodCallHandler((MethodCall call) {
    8. String method = call.method;
    9. if (_listeners[method] != null) {
    10. return _listeners[method](call);
    11. }
    12. return null;
    13. });
    14. }
    15. static HiFlutterBridge get instance => _instance;
    16. MethodChannel get bridge => _bridge;
    17. register(String method, Function(MethodCall) callback) {
    18. _listeners[method] = callback;
    19. }
    20. unregister(String method) {
    21. _listeners.remove(method);
    22. }
    23. gotoNative(Map params) {
    24. _bridge.invokeMethod("gotoNative", params);
    25. }
    26. }