首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kotlin(安卓)中使用Delegates.observable和StateFlow

在Kotlin(安卓)中使用Delegates.observable和StateFlow
EN

Stack Overflow用户
提问于 2021-03-30 17:43:06
回答 1查看 611关注 0票数 0

我有一个监视网络状态的类。我使用Flow来收集网络状态更新。但是,我还需要留下一个选项来使用手动侦听器,程序员可以将其“挂钩”以接收网络更改。

我的代码很简单:

代码语言:javascript
复制
 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-30 18:12:35

可观察的委托监视对属性本身的更改。对val属性使用可观察的方法是徒劳无益的,因为val属性从未设置为新值。属性委托完全看不到更改属性所指向的对象。

如果要观察更改,可以启动和收集:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66875918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档