【问题标题】:Changes in LiveData not visible in @Composable through observeAsState通过 observeAsState 在 @Composable 中看不到 LiveData 的变化
【发布时间】:2021-09-05 20:04:26
【问题描述】:

看来我在观察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

我做错了什么?

【问题讨论】:

  • 这段代码对我来说很好用,例如D/ShowAppsScreen2: ShowAppsScreen2: text = .; D/SharedViewModel: setName: Eva; D/ShowAppsScreen2: ShowAppsScreen2: text = Eva. 不知道怎么会变白。确定这是与这个问题相关的所有代码吗?
  • 是的,我认为这是与此问题相关的所有代码。老实说,这让我很生气,因为我看不出它有什么问题或隐藏在其他地方的东西。我将从头开始重写 Composable 和 ViewModel。

标签: android android-jetpack-compose android-viewmodel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多