[Flutter/Kotlin] 플랫폼 통신(Android) - Event Channel

Tyger·2022년 11월 13일
0

Event Channel_Android

Platform Channel 한 번에 이해하기 - IOS(swift) / Android(kotlin)

플랫폼 통신(IOS) - Method Channel
플랫폼 통신(IOS) - Event Channel
플랫폼 통신(Android) - Method Channel

이번 글에서는 안드로이드의 플랫폼 통신 중 Event Channel에 대해서 알아보도록 하겠다.

안드로이드 네이티브 코드는 Java/Kotlin 둘 중 아무거나 상관 없다.
여기서는 코틀린 코드로 작성할 예정이다.

예제는 1초에 한 번씩 네이티브에서 숫자를 1씩 증가시켜서 플랫폼 채널을 통해 플러터로 수신 받는 코드이다.

Android / Kotlin

MainActivity.kt

우선 여기서 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에 데이터를 넣어준다.

CounterHandler.kt

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

Flutter에서도 네이티브 코드에 작성한 이벤트 채널명으로 등록해주고 Stream으로 데이터를 수신받아 원하는 작업을 수행하면 된다.

이 부분은 앞서 작성한 IOS와 동일하게 수행한다.

const counterChannel = EventChannel('samples.flutter.dev/counter');
counterChannel.receiveBroadcastStream().listen((event) {
     print(event);
  });
profile
Flutter Developer

0개의 댓글