Wednesday, March 27, 2024

FlutterでAndroid(Kotlin)とiOS(Swift)にMethod ChannelとEvent Channelを使用する方法

Flutter の Method Channel と Event Channel の紹介

Flutter は、Dart とネイティブコード間の通信を可能にする様々なメカニズムを提供しています。その中でも、Method ChannelEvent 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