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

Bha*_*mar 10 kotlin redux android-jetpack-compose android-jetpack-compose-list

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

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

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

        LazyColumn {
         //some listview code here
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面,我想使用从 redux 存储中获取的数据。但商店。订阅方法是独立的,位于可组合项之外。其中,虽然我能够通过新数据更新状态,但更改不会反映回可组合列表视图:

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

            when (store.state) {
                store.state = // list data from some source
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Far*_*tas 9

您可以在可组合函数之外使用 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
}
Run Code Online (Sandbox Code Playgroud)


chu*_*ckj 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
    }
}

Run Code Online (Sandbox Code Playgroud)

确切的代码可能会有所不同,因为我不知道您正在使用什么 redux 实现。

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