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



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

我试图在我的可组合函数中访问我的dao实例,但给了我这个错误->内联fun-memory的计算参数内不允许进行可组合调用(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:我已经解决了这个错误,但想知道这个错误的意义是什么,为什么我不能记住里面的dao实例。

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

最新更新