我有一个监视网络状态的类。我使用Flow来收集网络状态更新。但是,我还需要留下一个选项来使用手动侦听器,程序员可以将其“挂钩”以接收网络更改。
我的代码很简单:
private val networkTypeState = MutableStateFlow<NetworkState>(NetworkState.Unknown)
val networkTypeAsFlow: StateFlow<NetworkState> by notifyDelegate(networkTypeState)
private fun <T> notifyDelegate(init: T) =
Delegates.observable(init) { prop, _, new ->
Lg.i("notify subscribers of network update: ${prop.name} = $new")
notifySubscribers()
}
sealed class NetworkState {
object Unknown: NetworkState()
object Disconnected: NetworkState()
data class Connected(val isCellularOn: Boolean, val isWifiOn: Boolean): NetworkState()
}然后,当我更新状态时,例如:
delegates.observable 不被称为。
值得注意的是,当我使用networkTypeAsFlow.collect { .. }时,这很好,这意味着-- networkTypeAsFlow确实被更新了,它只是没有调用delegates.observable
发布于 2021-03-30 18:12:35
可观察的委托监视对属性本身的更改。对val属性使用可观察的方法是徒劳无益的,因为val属性从未设置为新值。属性委托完全看不到更改属性所指向的对象。
如果要观察更改,可以启动和收集:
private val networkTypeState = MutableStateFlow<NetworkState>(NetworkState.Unknown)
val networkTypeAsFlow: StateFlow<NetworkState> = networkTypeState
init {
viewModelScope.launch {
networkTypeAsFlow.collect {
Lg.i("notify subscribers of network update: $it")
notifySubscribers()
}
}
}这里的另一个好处是,无论网络状态是从哪个线程更改的,始终都会从同一个调度程序调用notifySubscribers。
https://stackoverflow.com/questions/66875918
复制相似问题