我正在尝试访问我的房间数据库的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
函数中使用。remember
lambda用@DisallowComposableCalls
标记,从名称中可以理解它不允许可组合调用。所以它与mutableStateOf
无关,只与remember
有关。
您可能会面临同样的副作用问题,如LaunchedEffect
,或事件回调,如clickable
——在这些情况下,并没有@DisallowComposableCalls
,因为这些不是内联函数,回调将在@Composable
作用域的一侧调用。
您需要读取函数之外的值:
val context = LocalContext.current
var dao by remember {
mutableStateOf(NameDatabase.getInstance(context).getDao())
}