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

mrfwxfqh  于 2022-12-02  发布在  Android
关注(0)|答案(2)|浏览(261)

在使用. observveAsState()时,如何在更改MutableLiveData的值后开始执行代码块?
范例:MutableLiveData变更后,需要呼叫吐司。
这段代码返回错误在inline fun member的计算参数内部不允许组合调用(计算:()-〉类型变量(T)):类型变量(T)

@Composable
fun TextInfo() {
    val isSuccess by remember { viewModel.isSuccess.observeAsState() }//var isSuccess = MutableLiveData<Boolean>() — in ViewModel

    LaunchedEffect(isSuccess) {
        Log.d("IS SUCCESS", "trues")
    }
}
jk9hmnmh

jk9hmnmh1#

remember{…}内的块不是可组合作用域,当您尝试将@Composable函数放入lambda块或另一个不是可组合的函数时,您将遇到类似的问题。
我也不认为这里需要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
edqdpe6u

edqdpe6u2#

您可以在LaunchedEffect内创建吐司,即使在问题中不可用,我假设您尝试在LaunchedEffect内调用LocalContext.current,这是不允许的,因为LocalContext.current requires从可组合作用域调用。
Android中的可组合函数和普通函数有什么区别?

@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()
        }
    }
}

相关问题