我正在尝试使用 Jetpack compose 实现 redux。场景是这样的:- 我有一个列表视图,需要在可组合函数中显示数据。
@Composable
fun CreateListView(text: String) {
val listdata = state { store.state }
LazyColumn {
//some listview code here
}
}
以上,我想使用从 redux store 获得的数据。但是 store.subscription 方法是独立的,并且在可组合之外。在哪里,虽然我能够通过新数据更新状态,但更改没有反映回可组合的列表视图
// activity page outside composable
private fun storeSubscription(){
viewModel.storeSubscription = store.subscribe {
when (store.state) {
store.state = // list data from some source
}
}
}
是否可以像上面一样从函数外部更新可组合项,而无需发送任何参数。由于 redux 商店是全球性的,所以我认为它应该可以工作。
答案 0 :(得分:1)
尝试类似的东西,
@Composable
fun <T> Store<T>.asState(): State<T> {
val result = remember { mutableStateOf(store.state) }
DisposableEffect {
val unsubscribe = store.subscribe {
result.value = store.state
}
onDispose { unsubscribe() }
}
return result
}
@Composable
fun CreateListView(text: String) {
val listdata by store.asState()
LazyColumn {
//some listview code here
}
}
确切的代码可能会有所不同,因为我不知道您使用的是什么 redux 实现。
这会创建一个可观察的状态对象,只要调用传递给 subscribe
的 lambda,该对象就会更新。此外,当 CreateListView
不再是组合的一部分时,它会自动取消订阅。
答案 1 :(得分:0)
您必须遵循状态托管模式 来自Android Domcumentaiton
<块引用>关键术语:状态提升是一种将状态向上移动到树的模式 使组件无状态。
当应用于可组合物时,这通常意味着引入两个 可组合的参数:
值:T:要显示的当前值。 onValueChange:(T) - >单位:一个 请求更改值的事件,其中 T 是建议的新值 价值。
所以在你的情况下,你将状态保存在需要访问它的上层Composable中,并传递状态的值和一个lambda函数将其更改为另一个Composable,你可以从官方文档中了解更多信息。