android - 通过 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
我究竟做错了什么?
解决方案
代码很好。我在处理导航时犯了一个错误(不要问!),但是这段代码可以留在这里作为(我希望)处理@Composable
函数中初始操作的正确方法的参考。
推荐阅读
- flutter - 版本解决失败
- javascript - 混淆FF中文本框的条目
- c# - 使用工厂和构建器模式创建一些类的最佳方法
- android - 颤振系列
构造函数 - pine-script - 为什么这个计算会产生错误的结果?
- c++ - C++ 使用 ostream_iterator 解决 STL 容器的 ostream 运算符<< 重载
- c# - Unity:测试返回 IPromise 的异步函数
- c# - 无法解析类型“Microsoft.AspNetCore.DataProtection.IDataProtector”的服务
- javascript - 将 PHP 变量添加到 new Date()
- c++ - 如何正确添加 const char 类型的变量?