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