ネイティブとの通信 - 1m-llc/Flutter-KtoK GitHub Wiki

Flutter/Dart側

MethodChannel

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");
}

MethodChannelのinvokeMethodの定義

  • 第一引数のmethodは、メッセージの種別を判別するための、任意の文字列です。
  • 第二引数は、その際に渡したい引数の配列を指定します。
  • 上の例では"parameters"という文字列を渡しています。
  • 渡せるオブジェクトは基本的にプリミティブ型です。
Future<dynamic> invokeMethod(String method, [dynamic arguments]) async

受け取るネイティブ側ではMethodChannelのnameと、invokeMethodのmethodを条件分岐に使って処理します。

iOS側

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?) {
  ...
}

Android側

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(...)
}
⚠️ **GitHub.com Fallback** ⚠️