5

我正在尝试使用 Jetpack compose 实现 redux。场景如下所示:

我有一个列表视图,我需要在可组合函数中显示数据。

    @Composable
    fun CreateListView(text: String) {
     val listdata = state { store.state }

        LazyColumn {
         //some listview code here
        }
    }

上面,我想使用从 redux 商店获得的数据。但商店。订阅方法是独立的,并且在可组合之外。其中,虽然我能够通过新数据更新状态,但这些更改并没有反映回可组合的列表视图:

    // activity page outside composable
    private fun storeSubscription(){
        viewModel.storeSubscription = store.subscribe {

            when (store.state) {
                store.state = // list data from some source
            }
        }
    }

是否可以像上面一样从函数外部更新可组合项,而不发送任何参数?由于 redux 商店是一个全球性的商店,所以我认为它应该可以工作。

4

3 回答 3

2

您可以在可组合函数之外使用 MutableLiveData。当数据发生变化时,在可组合中使用 observeAsState() 来重构。

private val myLive = MutableLiveData<String>()

fun nonComposableScope(){
  myLive.postValue("hello")
}

@Composable
fun MyScreen(textLive:LiveData<String>){
  val text: String? by textLive.observeAsState()
  // use text here
}
于 2021-11-25T08:49:38.487 回答
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 实现。

这将创建一个可观察的状态对象,只要调用传递给的 lambda,该对象就会更新subscribeCreateListView此外,当不再是组合的一部分时,它将自动取消订阅。

于 2021-04-16T21:51:21.683 回答
0

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

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

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

value: T:要显示的当前值。onValueChange: (T) -> Unit:请求改变值的事件,其中 T 是建议的新值。

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

于 2021-04-10T08:42:07.700 回答