Skip to content

Broadcast ​

Broadcast は、PulseContainer から登録済みのすべての PulseViewModel へ型付きメッセージを同時に届ける仕組みです。

Broadcast を定義する ​

sealed class で PulseBroadcast を実装します。

kotlin
sealed class AppBroadcast : PulseBroadcast {
    data object Sync : AppBroadcast()
    data object UserLoggedOut : AppBroadcast()
    data class ThemeChanged(val isDark: Boolean) : AppBroadcast()
}

Broadcast を送る ​

Container の broadcast() を呼びます。

kotlin
container.broadcast(AppBroadcast.ThemeChanged(isDark = true))

Broadcast を受け取る ​

反応が必要な各 ViewModel で onReceive() をオーバーライドします。

kotlin
override fun onReceive(broadcast: AppBroadcast) {
    when (broadcast) {
        AppBroadcast.Sync -> syncData()
        AppBroadcast.UserLoggedOut -> update { AppState() }
        is AppBroadcast.ThemeChanged -> update { copy(isDark = broadcast.isDark) }
    }
}

Broadcast と Event の違い ​

BroadcastEvent
方向Container → すべての ViewModelViewModel → UI
多重度1 対多1 対 1
目的ViewModel 横断の調整一度きりの UI 副作用
型パラメータPulseBroadcastPulseEvent

例: 複数の ViewModel を同期する ​

kotlin
// 同じ Broadcast と Unicast の型を共有する 2 つの ViewModel
class HeaderViewModel : PulseViewModel<HeaderState, HeaderAction, HeaderEvent, AppBroadcast, AppUnicast>(...) {
    override fun onReceive(broadcast: AppBroadcast) {
        if (broadcast is AppBroadcast.UserLoggedOut) update { HeaderState() }
    }
}

class SidebarViewModel : PulseViewModel<SidebarState, SidebarAction, SidebarEvent, AppBroadcast, AppUnicast>(...) {
    override fun onReceive(broadcast: AppBroadcast) {
        if (broadcast is AppBroadcast.UserLoggedOut) update { SidebarState() }
    }
}

// 1 回の呼び出しで両方の ViewModel がリセットされる
container.broadcast(AppBroadcast.UserLoggedOut)

Apache 2.0 License の下で公開されています。