[英]How to start executing a block of code after changing the value of MutableLiveData when using .observeAsState()?
[英]How to start executing a block of code after changing the value of MutableLiveData when using .observeAsState() in Jetpack Compose?
using.observeAsState()时改变MutableLiveData的值后如何开始执行一段代码?
示例:MutableLiveData 更改后需要调用 Toast。
此代码返回错误 «内联乐趣的计算参数内不允许可组合调用 remember(calculation: () -> TypeVariable(T)): TypeVariable(T)»
@Composable
fun TextInfo() {
val isSuccess by remember { viewModel.isSuccess.observeAsState() }//var isSuccess = MutableLiveData<Boolean>() — in ViewModel
LaunchedEffect(isSuccess) {
Log.d("IS SUCCESS", "trues")
}
}
remember{…}
中的块不是可组合的 scope,当您尝试将@Composable
function 放入 lambda 块或另一个不可组合的 function 时,您会遇到类似的问题。
我也不认为你需要在这里remember{…}
,因为它已经被你的ViewModel
处理了
val isSuccess by viewModel.isSuccess.observeAsState()
LaunchedEffect(isSuccess) {
if (isSuccess) {
Log.d("IS SUCCESS", "trues")
}
}
我对你的代码做了一些尝试,像这样改变它,
val isSuccess by viewModel.isSuccess.observeAsState()
Button(onClick = { viewModel.updateSuccess() }) {}
LaunchedEffect(isSuccess) {
if (isSuccess) {
Log.e("IS_SUCCESS", "IS_SUCCESS? $isSuccess")
}
}
在你的ViewModel
中
fun updateSuccess() {
isSuccess.value = isSuccess.value?.not()
}
每次单击按钮时,它都会打印
29568-29568 E/IS_SUCCESS: IS_SUCCESS? true
29568-29568 E/IS_SUCCESS: IS_SUCCESS? true
您可以在 LaunchedEffect 内创建一个 Toast,即使有问题不可用我假设您尝试在 LaunchedEffect 内调用 LocalContext.current 这是不允许的,因为LocalContext.current requires
来自 Composable scope 的调用。
Android中的Composable function和normal function有什么区别?
@Composable
fun TextInfo() {
val isSuccess by remember { viewModel.isSuccess.observeAsState() }//var isSuccess = MutableLiveData<Boolean>() — in ViewModel
val context = LocalContext.current
LaunchedEffect(isSuccess) {
if(isSuccess){
Toast.makeText(context, "IS SUCCESS", "trues", Toast.LENGTH_SHORT).show()
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.