首页 > 解决方案 > 通过 observeAsState 在 @Composable 中看不到 LiveData 的变化

问题描述

看来我在观察时犯了错误,LiveData似乎找不到错误在哪里。

这是代码@Composable

@Composable
fun ShowAppsScreen2(
    viewModel: SharedViewModel
) {

    val text: String by viewModel.name.observeAsState(initial = "")

    Log.d("ShowAppsScreen2", "ShowAppsScreen2: text = $text.")

    Column(modifier = Modifier
        .fillMaxSize(1f)
        .background(color = Color.Red)) {
        Text("TEXT: $text")
    }

    LaunchedEffect(Unit) {
        viewModel.fetchName("Eva")
    }

}

这是代码SharedViewModel

@HiltViewModel
class SharedViewModel @Inject constructor(
    //...
) ViewModel() {

    private val _name: MutableLiveData<String> = MutableLiveData()
    val name: LiveData<String> = _name

    fun fetchName(someName: String) {
        viewModelScope.launch {
            delay(500)
            Log.d(TAG, "setName: $someName")
            _name.postValue(someName)
        }
    }    

}

首先,我看到了我设置的红色屏幕,@Composable其中包含预期Text的文本“TEXT:” 。之后,我只看到白屏,好像发生了一些错误并且屏幕没有重新渲染。

在日志中我得到这个:

D ShowAppsScreen2: ShowAppsScreen2: text = . 
D ShowAppsScreen2: ShowAppsScreen2: text = . 
D ShowAppsScreen2: ShowAppsScreen2: text = . 
D SharedViewModel: setName: Eva

我究竟做错了什么?

标签: androidandroid-jetpack-composeandroid-viewmodel

解决方案


代码很好。我在处理导航时犯了一个错误(不要问!),但是这段代码可以留在这里作为(我希望)处理@Composable函数中初始操作的正确方法的参考。


推荐阅读