【问题标题】:Jetpack Compose with Coroutine's StateFlowJetpack Compose 与 Coroutine 的 StateFlow
【发布时间】:2021-03-05 14:45:04
【问题描述】:

我在使用带有 Jetpack Compose 的 StateFlow 时遇到了一个奇怪的问题,我没有收到 StateFlow 中的更新值。这是我尝试按照示例中的建议观察 Stateflow 的代码。

@Composable
fun List(homeViewModel: HomeViewModel) {

val appState by homeViewModel.stateFlow.collectAsState()

if (appState.isLoading) {
    CircularProgressIndicator()
}
MaterialTheme {
    LazyColumn {
        items(appState.names) { name ->
            Name(name = name.name)
        }
    }
}

}

我正确收到了初始值,但没有收到更新后的值

setContent {
  Surface(color = MaterialTheme.colors.background) {
                List(mainViewModel.homeViewModel)
      }
}

我已经像这样在 viewModel 中定义了我的 stateFlow

internal val stateFlow = MutableStateFlow(AppState())

我通过这个更新值

stateFlow.value = AppState(loading = false, listOf("1", "2"))

我的 AppState Pojo

data class AppState(val names: List<Names> = emptyList(), val isLoading: Boolean = true, val error: Throwable? = null)

问题是,当我像上面那样更新 stateFlow 的值时,我希望可组合组件能够重新组合和更新该值,但更新后的值永远不会出现在我上面的可组合方法中。我需要一点帮助来了解我哪里出错了

PS:我还没有在 LiveData 上尝试过这个

【问题讨论】:

标签: android android-jetpack android-jetpack-compose


【解决方案1】:

基于你在推特上提到的https://github.com/cyph3rcod3r/D-KMP-Architecture 项目:

问题在于,在以下代码中,每次调用 getter 时都会创建一个新的 HomeViewModel 实例,这意味着您正在观察的 homeViewModel.stateFlow 和您正在更新的实例是不同的。

class MainViewModel : ViewModel() {
     val homeViewModel get() = HomeViewModel()

    fun getListOfNames(){
        homeViewModel.getList()
    }
}

【讨论】:

  • -_- 错过这个真是太愚蠢了。非常感谢@john 指出这一点,从变量中删除 get() 效果很好。感谢社区的支持??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多