繁体   English   中英

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM