是否可以使用方法通道在 Android 应用程序和构建并包含为“aar”的 flutter 模块之间进行通信?

Nat*_*hat 14 android aar flutter flutter-dependencies

本指南讨论flutter和原生android之间对话的方法通道。

https://flutter.dev/docs/development/platform-integration/platform-channels

我已经为我的 flutter 模块生成了“aar”文件,并将该 aar 文件包含在我的本机 android 应用程序中。现在,当我单击 Android 应用程序中的按钮时,我将通过 Android 中的 FlutterActivity 类启动我的 flutter 模块。

现在我的问题是,如何在本机 android 代码和生成的 aar 代码之间进一步通信?

如何编写我的 flutter 模块,以便当我生成“aar”文件并包含在我的 android 应用程序中时,我能够在它们之间建立通信?

小智 1

您提到的指南讨论了平台通道以及如何通信(Flutter 端Android 端)。

就您而言,要在 Flutter 和 Android 之间进行通信,MethodChannel双方都需要一个。

创建 MethodChannel 时,您必须提供一个唯一的名称(通常是您的包域名),以便引擎在您的 Flutter 端和 Android 端之间创建一个通道。

颤振侧:

class MyPlugin {
  static const _channel = MethodChannel("example.dev/plugin");

  Future<String> getHelloWorld() async {
    final message = await _channel.invokeMethod<String>("getHelloWorld");

    print(message);
    return message;
  }
}
Run Code Online (Sandbox Code Playgroud)

Android 端(Kotlin):

class MyPlugin : FlutterPlugin, MethodCallHandler {
  private lateinit var channel: MethodChannel

  override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(binding.binaryMessenger, "example.dev/plugin")
    channel.setMethodCallHandler(this)
  }

  override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "getHelloWorld") {
      result.success("Hello world!")
      return
    }
    result.notImplemented()
  }
}
Run Code Online (Sandbox Code Playgroud)

onMethodCall当您从 Flutter 端调用时,会在 Android 端调用invokeMethod。请注意,您将一个字符串传递给invokeMethod,它将在 Android 端可用call.method,如上面的示例所示。当您需要传递其他参数时,可以使用以下命令:

颤振侧:

// ...

int age = 42;
String message = "This is the way";

String answer = await _channel.invokeMethod<String>("getMessage", <String, Object>{
  "age": age,
  "message": message
});

print(answer);

// ...
Run Code Online (Sandbox Code Playgroud)

Android 端(Kotlin):

// ...

if (call.method == "getMessage") {
  if (!call.hasArgument("age") || !call.hasArgument("message")) {
    result.error("MissingArgumentError", "You must provide age and message parameters.", null)
    return
  }
  val age: Int = call.argument<Int>("age")!!
  val message: String = call.argument<String>("message")!!

  result.success("$message at $age years old")
  return
}

// ...
Run Code Online (Sandbox Code Playgroud)

您可以通过 MethodChannel 传递常见类型的数据,请参阅支持的类型列表

EventChannel同样,您可以在双方之间使用 an来发出事件(也称为 Stream)。

您将在指南中找到更多详细信息,因为它来自官方文档。