使用 Jetpack Compose 时无法创建 com.example.project.mainViewModel 的实例

问题描述 投票:0回答:1

“大家好,我正在尝试使用 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)
            }
        }
    }
}

任何人都可以帮我找到这个问题的解决方案吗?

android kotlin android-jetpack-compose viewmodel android-viewmodel
1个回答
0
投票

由于您没有使用 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 就可以访问所需的依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.