簡體   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