ネイティブとの通信 - 1m-llc/Flutter-KtoK GitHub Wiki
DartからはMethodChannelでメッセージを送信し、AndroidではMethodChannel、iOSではFlutterMethodChannel経由でメッセージを受け取ります。
main.dart
// MethodChannelには任意の名前をつけることができますが、慣習的にパッケージ名をprefixに使うようです
MethodChannel _methodChannel = MethodChannel('package.name/sample');
// ネイティブへのメッセージ送信>画面遷移
Future<Null> _launchNativeScreen() async {
// ネイティブ側へメッセージを送信
await _methodChannel.invokeMethod('test', "parameters");
}
- 第一引数のmethodは、メッセージの種別を判別するための、任意の文字列です。
- 第二引数は、その際に渡したい引数の配列を指定します。
- 上の例では"parameters"という文字列を渡しています。
- 渡せるオブジェクトは基本的にプリミティブ型です。
Future<dynamic> invokeMethod(String method, [dynamic arguments]) async
受け取るネイティブ側ではMethodChannelのnameと、invokeMethodのmethodを条件分岐に使って処理します。
AppDelegate.swift
/// main.dartでMethodChannelのコンストラクタで指定した文字列
private let methodChannelName = "package.name/sample"
/// main.dartでinvokeMethodの第一引数に指定したmethodの文字列
private let methodTest = "test"
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let methdoChannel = FlutterMethodChannel(name: methodChannelName, binaryMessenger: viewController.binaryMessenger)
methdoChannel.setMethodCallHandler { [weak self] methodCall, result in
if methodCall.method == self?.methodTest {
// invokeMethodの第二引数で指定したパラメータを受け取れます
let parameters = methodCall.arguments as? String
self?.launchiOSScreen(parameters)
}
}
...
}
private func launchiOSScreen(_ parameters: String?) {
...
}
MainActivity.kt
companion object {
// main.dartでMethodChannelのコンストラクタで指定した文字列です
private const val CHANNEL = "package.name/sample"
// main.dartでinvokeMethodの第一引数に指定したmethodの文字列です
private const val METHOD_TEST = "test"
}
override fun onCreate(savedInstanceState: Bundle?) {
...
// MethodChannelからのメッセージを受け取ります
// (flutterViewはFlutterActivityのプロパティ、CHANNELはcompanion objectで定義しています)
MethodChannel(this.flutterView, CHANNEL)
.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
if (methodCall.method == METHOD_TEST) {
// invokeMethodの第二引数で指定したパラメータを取得できます
val parameters = methodCall.arguments<String>()
launchAndroidScreen(parameters)
}
}
}
...
}
private fun launchAndroidScreen(parameters: String) {
startActivity(...)
}