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

Kar*_*ouh 6 mvvm viewmodel android-jetpack-compose dagger-hilt

我正在做与此处的文档中所示相同的操作。我想将 ViewModel 注入可组合函数(屏幕),但出现此错误:

无法创建类 com.example.blotube.ui.later.LaterViewModel 的实例

我的视图模型:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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


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

}
Run Code Online (Sandbox Code Playgroud)

Sep*_*ehr 55

从版本中,androidx.hilt:hilt-navigation-compose:1.0.0-alpha02 您可以通过以下方式将视图模型注入可组合函数:

hiltViewModel<ViewModelType>()
Run Code Online (Sandbox Code Playgroud)

例子:

@Composable 
fun LoginScreen(viewModel: LoginViewModel) {}

LoginScreen(
    viewModel = hiltViewModel<LoginViewModel>()
)
Run Code Online (Sandbox Code Playgroud)

Android 开发者文档的撰写和处理

更新:

import androidx.hilt.navigation.compose.hiltViewModel

@Composable 
fun LoginScreen(
    viewModel: LoginViewModel = hiltViewModel()
){
   val videos=vm.watchLater.observeAsState()
   val context= LocalContext.current
}
Run Code Online (Sandbox Code Playgroud)


Oti*_*wel 10

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

@Composable 
fun Foo(){
    val viewModel : Bar = hiltViewModel()
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以像往常一样使用视图模型了。


Jat*_*eva 9

您可以通过hiltViewModel()直接在 Composable 函数中使用 ViewModel

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

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

}
Run Code Online (Sandbox Code Playgroud)

请务必添加以下内容

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


Fra*_*esc 6

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

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

val viewModel: LaterViewModel = viewModel(
    "later_viewmodel",
    factory = defaultViewModelProviderFactory
)
WatchLater(viewModel)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是导航图组件,您还可以使用以下命令将视图模型范围限定到导航图

val viewModel: LaterViewModel = hiltNavGraphViewModel<LaterViewModel>()
WatchLater(viewModel)
Run Code Online (Sandbox Code Playgroud)