内联 fun 的计算参数内部不允许可组合调用

Anu*_*ngh 4 android kotlin android-jetpack-compose

我正在尝试访问我的房间数据库的 dao 实例,该数据库用于存储名称(我编写此代码只是为了熟悉 jetpack compose)。

我尝试在可组合函数中访问我的 dao 实例,但给出了此错误 -> 内联乐趣的计算参数中不允许进行可组合调用 Remember(calculation: () -> TypeVariable(T)): TypeVariable(T)

我的代码

@Composable
fun HomeScreen(navController: NavController){
 var dao by remember{
     mutableStateOf(NameDatabase.getInstance(LocalContext.current).getDao())
 }
 var scope = rememberCoroutineScope()
 var username by rememberSaveable{ mutableStateOf("") }
 Column(
     modifier = Modifier.fillMaxSize(),
     horizontalAlignment = Alignment.CenterHorizontally,
     verticalArrangement = Arrangement.Center
 ){
     OutlinedTextField(value = username, onValueChange = {username=it})
     Spacer(modifier = Modifier.height(10.dp))
     Button(onClick = {
         navController.navigate("showScreen/$username")

     }) {
         Text("Submit")
     }
 }
}
Run Code Online (Sandbox Code Playgroud)

我在这条线上收到错误 mutableStateOf(NameDatabase.getInstance(LocalContext.current).getDao())

具体LocalContext.current就是给出这个错误。

PS:我已经解决了这个错误,但想知道这个错误的含义是什么以及为什么我无法记住里面的dao实例。

Phi*_*hov 12

LocalContext.current标记为 且@Composable只能在另一个@Composable函数内使用。rememberlambda 被标记为@DisallowComposableCalls, 从名字上就可以明白它不允许可组合调用。所以它与 无关mutableStateOf,仅与相关remember

您可能会遇到与副作用相同的问题,例如LaunchedEffect或事件回调,例如clickable- 在这些情况下,没有,@DisallowComposableCalls因为这些不是内联函数,并且回调将在@Composable范围内调用。

您需要读取函数外部的值:

val context = LocalContext.current
var dao by remember {
    mutableStateOf(NameDatabase.getInstance(context).getDao())
}
Run Code Online (Sandbox Code Playgroud)