“大家好,我正在尝试使用 Jetpack Compose 构建 Android 应用程序。但是,当我尝试运行该应用程序时,出现如下错误:
进程:com.example.bangkit_recycleview,PID:7393 java.lang.RuntimeException:无法创建 com.example.pokedex.MainViewModel 类的实例
我没有使用 hilt,我只想使用 jetpack compose,但当我不使用 hilt 时,我遇到这样的错误,我放置了代码的详细信息,以便您可以更清楚地看到它
这是我的代码:
//主活动屏幕
@Composable
fun MainActivityScreen(viewModel: MainViewModel = viewModel()) {
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()
val foods = viewModel.foods
LaunchedEffect(key1 = context) {
viewModel.getAllFoods()
}
}
//主视图模型
class MainViewModel(private val foodDao: FoodDao) : ViewModel() {
private var _foods: List<FoodEntity> = emptyList()
val foods: List<FoodEntity>
get() = _foods
fun getAllFoods() {
viewModelScope.launch {
_foods = withContext(Dispatchers.IO) {
foodDao.getAllFoods()
}
}
}
fun insertFood(newFood: FoodEntity) {
viewModelScope.launch {
withContext(Dispatchers.IO) {
foodDao.insert(newFood)
}
}
}
}
任何人都可以帮我找到这个问题的解决方案吗?
由于您没有使用 Hilt 进行依赖注入,因此您需要手动向 MainViewModel 提供 FoodDao 的实例。
您可以修改代码以向 MainViewModel 提供 FoodDao 依赖项:
@Composable
fun MainActivityScreen(viewModel: MainViewModel = viewModel()) {
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()
val foodDao = remember { AppDatabase.getInstance(context).foodDao()}
val viewModel = remember { MainViewModel(foodDao)}
val foods = viewModel.foods
LaunchedEffect(key1 = context) {
viewModel.getAllFoods()
}
}
在此修改中,我们使用 AppDatabase 创建 FoodDao 的实例(假设 AppDatabase 是您的 Room 数据库类)并将其传递给 MainViewModel 构造函数。这样,MainViewModel 就可以访问所需的依赖项。