如何使用 Hilt (Jetpack Compose) 将 ViewModel 注入可组合函数

How to inject a ViewModel into a composable function using Hilt (Jetpack Compose)

我正在做与文档 here 中显示的相同的事情。 我想将 ViewModel 注入到可组合函数(屏幕)中,但出现此错误:

Cannot create an instance of class com.example.blotube.ui.later.LaterViewModel

我的视图模型:

@HiltViewModel
class LaterViewModel @Inject constructor(
    private val database: Database
):ViewModel() {

    val watchLater=database.videos().getAll()

}

我的可组合函数(屏幕):

@Composable
fun WatchLater(vm: LaterViewModel = viewModel()){


    val videos=vm.watchLater.observeAsState()
    val context= LocalContext.current
    

}

这似乎是 Jetpack Compose 中的错误,可能需要等待 Jetpack 库更新才能解决。

作为一种可能的解决方法,您可以在 activity 中实例化视图模型并将其传递给可组合函数

val viewModel: LaterViewModel = viewModel(
    "later_viewmodel",
    factory = defaultViewModelProviderFactory
)
WatchLater(viewModel)

如果您使用的是导航图组件,您还可以使用

将您的视图模型限定在导航图范围内
val viewModel: LaterViewModel = hiltNavGraphViewModel<LaterViewModel>()
WatchLater(viewModel)

来自版本 androidx.hilt:hilt-navigation-compose:1.0.0-alpha02 您可以通过以下方式将视图模型注入 Composable 函数:

hiltViewModel<ViewModelType>()

示例:

@Composable fun LoginScreen(viewModel: LoginViewModel) {}
LoginScreen(hiltViewModel<LoginViewModel>())

Developer.Android-Refrence

您可以通过 hiltViewModel()

在 Composable 函数中直接使用 ViewModel
@Composable
fun WatchLater(vm: LaterViewModel = hiltViewModel()){

val videos=vm.watchLater.observeAsState()
val context= LocalContext.current

}

请务必添加以下内容

  1. androidx.hilt:hilt-navigation-compose 依赖项添加到模块级别 Gradle 文件。检查最新版本(在 1.0.0-alpha03 上测试)。
  2. @HiltViewModel 到您的 ViewModel。
  3. @AndroidEntryPoint 使用 Composable 功能的所有者。

我发现最简单的方法是在您的可组合函数中。 添加依赖 implementation 'androidx.hilt:hilt-navigation-compose:1.0.0' then;

@Composable 
fun Foo(){
    val viewModel : Bar = hiltViewModel()
}

然后你就可以照常使用viewmodel了。