在可组合函数之外更新状态 喷气背包组合

问题描述

我正在尝试使用 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 商店是全球性的,所以我认为它应该可以工作。

解决方法

尝试类似的东西,

@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 不再是组合的一部分时,它会自动取消订阅。

,

您必须遵循状态托管模式 来自Android Domcumentaiton

关键术语:状态提升是一种将状态向上移动到树的模式 使组件无状态。

当应用于可组合物时,这通常意味着引入两个 可组合的参数:

值:T:要显示的当前值。 onValueChange:(T) - >单位:一个 请求更改值的事件,其中 T 是建议的新值 价值。

所以在你的情况下,你将状态保存在需要访问它的上层Composable中,并传递状态的值和一个lambda函数将其更改为另一个Composable,你可以从官方文档中了解更多信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...