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