Platform Channel 한 번에 이해하기 - IOS(swift) / Android(kotlin)
플랫폼 통신(IOS) - Method Channel
플랫폼 통신(IOS) - Event Channel
플랫폼 통신(Android) - Method Channel
이번 글에서는 안드로이드의 플랫폼 통신 중 Event Channel에 대해서 알아보도록 하겠다.
안드로이드 네이티브 코드는 Java/Kotlin 둘 중 아무거나 상관 없다.
여기서는 코틀린 코드로 작성할 예정이다.
예제는 1초에 한 번씩 네이티브에서 숫자를 1씩 증가시켜서 플랫폼 채널을 통해 플러터로 수신 받는 코드이다.
우선 여기서 FlutterFragmentActivity()는 원래 FlutterActivity()로 되어있을 것이다. 이 부분의 코드는 원래되로 해둬 상관없다.
여기서 생성하는 eventChanel의 이름으로 플러터에서도 호출을 하는 이벤트 명으로 사용하기에 고유한 이벤트 명을 자유롭게 사용하면 된다.
이벤트 채널에 핸들러를 넣어주면 된다.
class MainActivity: FlutterFragmentActivity(){
private val eventChannel = "samples.flutter.dev/counter"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
EventChannel(flutterEngine.dartExecutor.binaryMessenger, eventChannel).setStreamHandler(
CounterHandler
)
}
}
핸들러 객체안에서 IOS와 동일하게 onListen(), onCancel()에서 eventSink에 데이터를 넣어준다.
object CounterHandler : EventChannel.StreamHandler {
private val handler = Handler(Looper.getMainLooper())
private var eventSink: EventChannel.EventSink? = null
private var counter: Int = 0
private val runnable: Runnable = object : Runnable {
override fun run() {
countUp()
}
}
fun countUp() {
eventSink?.success(counter++)
handler.postDelayed(runnable, 1000)
}
override fun onListen(arguments: Any?, sink: EventChannel.EventSink) {
eventSink = sink
handler.post(runnable)
}
override fun onCancel(arguments: Any?) {
eventSink = null
handler.removeCallbacks(runnable)
}
}
Flutter에서도 네이티브 코드에 작성한 이벤트 채널명으로 등록해주고 Stream으로 데이터를 수신받아 원하는 작업을 수행하면 된다.
이 부분은 앞서 작성한 IOS와 동일하게 수행한다.
const counterChannel = EventChannel('samples.flutter.dev/counter');
counterChannel.receiveBroadcastStream().listen((event) {
print(event);
});