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