我是一个Android开发的初学者,我不知道如何解决这个问题. 有一个简单的视图模型,它包含一个变量:
var testQuestionsAmount by mutableStateOf(10)
private set
我在主屏幕中使用这个变量,一切正常,但我也试图在另一个屏幕中使用它作为导航参数,从DB获得一定数量的问题,并且出于某种原因,它会无限更新,导致无限的问题生成.
//For some reason, this updates infinitely
@Composable
fun GeneratedTestScreen(questionsAmount: Int) {
val context = LocalContext.current
val questionRepository by lazy {
QuestionRepository(QuestionDatabase.getInstance(context).dao)
}
val questionsList = questionRepository.getRandomQuestions(questionsAmount).collectAsState(initial = emptyList()).value
val currentTestViewModel = viewModel<GeneratedTestScreenViewModel>(
factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return GeneratedTestScreenViewModel(questionsList = questionsList) as T
}
}
)
Log.d("AMOUNT", questionsAmount.toString())
}
导航图中的已生成测试屏幕:
composable(route = Screen.GeneratedTest.route, arguments = listOf(
navArgument("questionsAmount") {
type = NavType.IntType
}
)) {
val questionsAmount = it.arguments?.getInt("questionsAmount")
GeneratedTestScreen(questionsAmount ?: 1)
}
在密封的班级中:
object GeneratedTest : Screen("GeneratedTest/{questionsAmount}", Icons.Rounded.List, "Test") {
fun putQuestionsAmount(amount: Int): String {
return "GeneratedTest/$amount"
}
}
从主屏幕导航到生成的测试屏幕:
@Composable
fun TestGenerationScreen(navController: NavController) {
val viewModel = viewModel<TestGenerationScreenViewModel>()
...
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.weight(1f)
.fillMaxWidth()
) {
Button(
shape = RoundedCornerShape(dimensionResource(id = R.dimen.padding_small)),
colors = ButtonDefaults.buttonColors(colorResource(id = R.color.approval_green)),
// Navigation from main to GeneratedTestScreen
onClick = { navController.navigate(Screen.GeneratedTest.putQuestionsAmount(viewModel.testQuestionsAmount)) },
modifier = Modifier.align(Alignment.CenterHorizontally)
) {
Text(text = stringResource(id = R.string.test_gen_screen_start_test_button_text))
}
}
}
}
我试着用谷歌搜索它,我发现唯一一件事是,在屏幕从后台堆栈中移除后,viewModel会在内存中保留一段时间,但在我的例子中,主屏幕和GeneratedTestScreen仍然在后台堆栈中.这与这个问题完全无关.我还判断了我的房间查询两次,它是正确的.
那么,我怎么才能修复它呢?这种行为的原因是什么?
另外,对不起,我的英语不好.