inline fun 的计算参数内不允许组合调用

Composable calls are not allowed inside the calculation parameter of inline fun

我正在尝试访问用于存储名称的房间数据库的 dao 实例(我编写的这段代码只是为了熟悉 Jetpack Compose)。

我试图在我的可组合函数中访问我的 dao 实例,但给我这个错误 -> 在内联乐趣的计算参数中不允许可组合调用 remember(calculation: () -> TypeVariable(T)):类型变量(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")
     }
 }
}

我在这一行收到错误 mutableStateOf(NameDatabase.getInstance(LocalContext.current).getDao())

具体来说 LocalContext.current 给出了这个错误。

PS: 我已经解决了这个错误,但想知道这个错误是什么意思,为什么我无法在 remember 中获取 dao 实例。

LocalContext.current 标记为 @Composable 并且只能在其他 @Composable 函数中使用。 remember lambda 被标记为@DisallowComposableCalls,从名字就可以理解它不允许组合调用。所以它与 mutableStateOf 无关,仅与 remember.

相关

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

您需要读取函数外的值:

val context = LocalContext.current
var dao by remember {
    mutableStateOf(NameDatabase.getInstance(context).getDao())
}