Flutter の Method Channel と Event Channel の紹介
Flutter は、Dart とネイティブコード間の通信を可能にする様々なメカニズムを提供しています。その中でも、Method Channel
とEvent Channel
は特に重要です。
Method Channel
は、Dart とネイティブコード間の単方向通信を提供します。これを使うと、Dart からネイティブ関数を呼び出し、結果を受け取ることができます。
void main(){ const platform = MethodChannel('samples.flutter.dev/battery'); String batteryLevel = 'Unknown battery level.'; Future<void> _getBatteryLevel() async { String batteryLevel; try { final int result = await platform.invokeMethod('getBatteryLevel'); batteryLevel = 'Battery level at $result % .'; } on PlatformException catch (e) { batteryLevel = "Failed to get battery level: '${e.message}'."; } } }
一方、Event Channel
は、Dart とネイティブコード間のイベントベースの双方向通信を提供します。これを使うと、ネイティブコードで発生したイベントを Dart で受信し、処理することができます。
void main(){ const eventChannel = EventChannel('samples.flutter.dev/connectivity'); void _enableEventReceiver() { eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError); } void _onEvent(Object event) { setState(() { _connectionStatus = event.toString(); }); } void _onError(Object error) { setState(() { _connectionStatus = 'Failed to get connectivity.'; }); } }
Android (Kotlin) で Method Channel と Event Channel を使う
Android で Flutter と通信するために Method Channel と Event Channel を使う方法を見ていきましょう。まずは Method Channel の使い方から見ていきます。
void main(){ MethodChannel channel = MethodChannel("com.example/app") channel.setMethodCallHandler { call, result -> if (call.method == "getBatteryLevel") { val batteryLevel = getBatteryLevel() if (batteryLevel != -1) { result.success(batteryLevel) } else { result.error("UNAVAILABLE", "Battery level not available.", null) } } else { result.notImplemented() } } }
上のコードは、Android (Kotlin) で Flutter からメソッド呼び出しを受け取り、処理する例です。ここでは 'getBatteryLevel' というメソッド呼び出しを受け取り、バッテリーレベルを返しています。
次に、Event Channel の使い方を見ていきましょう。
void main(){ EventChannel eventChannel = EventChannel("com.example/app/events") eventChannel.setStreamHandler( object : StreamHandler { private var eventSink: EventChannel.EventSink? = null override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { eventSink = events } override fun onCancel(arguments: Any?) { eventSink = null } } ) }
上のコードは、Android (Kotlin) で Flutter にイベントを送信する例です。ここでは EventChannel を通じてイベントを送信できる EventSink を設定しています。
iOS (Swift) で Method Channel と Event Channel を使う
iOS で Flutter と通信するために Method Channel と Event Channel を使う方法を見ていきましょう。まずは Method Channel の使い方から見ていきます。
void main(){ let channel = FlutterMethodChannel(name: "com.example/app", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in if call.method == "getBatteryLevel" { self.receiveBatteryLevel(result: result) } else { result(FlutterMethodNotImplemented) } } }
上のコードは、iOS (Swift) で Flutter からメソッド呼び出しを受け取り、処理する例です。ここでは 'getBatteryLevel' というメソッド呼び出しを受け取り、バッテリーレベルを返しています。
次に、Event Channel の使い方を見ていきましょう。
void main(){ let eventChannel = FlutterEventChannel(name: "com.example/app/events", binaryMessenger: controller.binaryMessenger) eventChannel.setStreamHandler(self) }
上のコードは、iOS (Swift) で Flutter にイベントを送信する例です。ここでは EventChannel を通じてイベントを送信できる StreamHandler を設定しています。
0 개의 댓글:
Post a Comment