观察实时数据并在jetpack compose中导航



我刚开始学习喷气背包作曲。我有一个非常基本的问题。我的ViewModel有一个SingleLiveEvent,我用它来导航到另一个屏幕。

private val _navigateToDetails: SingleLiveEvent<Movie> = SingleLiveEvent()
val navigateToDetails: MutableLiveData<Movie> = _navigateToDetails

我知道我可以使用Livedata作为状态来发出UI,但如何使用它来触发compositable中的一些操作。

以前,我使用viewLifecycleOwner来观察状态,就像任何人都会这样做一样。

viewModel.navigateToDetails.observe(viewLifecycleOwner) {
// navigate to details
}

我怎样才能在写作中达到同样的目的呢。我不知道这是否可能。也许我不是这样想的。如有任何帮助,我们将不胜感激。

我会做一些类似的事情来确保我只做一次:

@Composable
fun LoginScreen(viewModel: LoginViewModel) {
val loginState by viewModel.loginState.observeAsState(null)
val hasHandledNavigation = remember { mutableStateOf(false)}
if (loginState != null && !hasHandledNavigation.value ) {
navigateToWelcomeScreen()
else {
// rest of the Compose UI
}
}

更新:选项二,您也可以将进入下一个屏幕的操作传递给viewmodel并在那里启动它。

实际上,在compose中,我们在LiveData上使用mutableStateOf()。在视图模型中,您可以将数据持有者的类型从LiveData更改为mutableStateOf(…(,这将允许您在不显式调用observe((的情况下直接在Composable中使用它

假设您希望在视图模型中存储任何类型的整数,并在此基础上更新可组合的状态。

在您的视图模型中,

var mInteger by mutableStateOf (0) //'by' helps treat state as data
fun updateMInteger(newValue: Int){
mInteger = newValue
}

在您的Composable中,直接调用viewmodel.mInteger,然后像这样构建Compose,自动更新UI,假设mInteger正在从Composable 中读取

Text(viewModel.mInteger)

最新更新