【问题标题】:Observe livedata and navigate in jetpack compose观察 livedata 并在 jetpack compose 中导航
【发布时间】:2021-06-10 02:19:58
【问题描述】:

我刚开始学习jetpack compose。我有一个非常基本的问题。我的 ViewModel 有一个 SingleLiveEvent,我用它来导航到另一个屏幕。

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

我知道我可以使用 Livedata 作为状态来发出 UI,但如何使用它来触发可组合内的某些操作。

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

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

我如何在撰写中实现相同的目标。我不知道这是否可能。也许我并没有以撰写方式思考这一点。任何帮助将不胜感激。

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-jetpack-navigation


    【解决方案1】:

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

    @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 并在那里启动它。

    【讨论】:

      【解决方案2】:

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

      假设您希望在您的视图模型中存储任何类型的整数,并据此更新您的 Composable 的状态。

      在您的视图模型中,

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

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

      喜欢

      Text(viewModel.mInteger)
      

      【讨论】:

      • 我想你没有得到这个问题。我没有尝试发出 UI,而是尝试在可组合内的 livedata 更改时触发一些代码(可能是 lambda)。我尝试触发一些代码并且它有效,但问题是它的行为不像 SingleLiveData 并且每次我返回上一个屏幕时都会触发事件。
      • 您是否使用了一些非原始数据类型作为状态?我几乎可以肯定您所描述的事情正在发生,因为状态存储在状态持有者中,但是您想要通过更改触发的代码(看似可组合)并未将其视为状态。你看如果你想在程序的任何其他部分改变一个值时触发 Composable 中的一些代码,你需要确保你要么使用原始类型状态,比如 mutableStateOf(Int),要么定义一个自定义的 MutableState 因为你不能只写 mutableStateOf (T) 来使用某物作为状态
      • 我的意思是这就是我的经验
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多