【Android】SharedFlow를 사용하여 EventBus 만들기

전치



좋아요 처리, 즐겨찾기 처리 등, 화면간을 넘은 이벤트 송신을 실시하고 싶은 경우, 지금까지는 EventBus 나 otto를 사용하고 있었던 것이 많다고 생각합니다.

하지만 SharedFlow를 사용하면 라이브러리를 사용하지 않고도 스스로 쉽게 구현할 수 있으므로, 비망록이 테라 샘플을 써 둡니다.

실은 SharedFlow의 공식 페이지에도 샘플이 써 있습니다.
이번에는 조금만 망했을 뿐입니다

샘플



CoroutineEventStore.kt
class CoroutineEventStore {
    companion object {
        private var instance: CoroutineEventStore = CoroutineEventStore()
        fun getInstance() : CoroutineEventStore {
            return instance
        }
    }

    // Eventはこれを継承すること
    interface CoroutineEvent

    private val _events = MutableSharedFlow<CoroutineEvent>()
    val events = _events.asSharedFlow()

    suspend fun post(event: CoroutineEvent) {
        _events.emit(event)
    }
}

data class HogeEvent(val data: **): CoroutineEventStore.CoroutineEvent

사용법



전송


CoroutineEventStore.getInstance().post(hogeEvent)

수신


**Scope.launch {
  CoroutineEventStore.getInstance().events
    .mapNotNull { if (it is HogeEvent) it else null }
    .collect {
      // 受信時の処理を書く
    }
}

특히 수신 처리는 각 Event 클래스마다 UseCase 등으로 나누어 주면 사용하기 쉽다고 생각합니다.
매우 간단하게 EventBus를 만들 수 있기 때문에 고맙습니다

좋은 웹페이지 즐겨찾기