如何使用 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>())
您可以通过 hiltViewModel()
在 Composable 函数中直接使用 ViewModel
@Composable
fun WatchLater(vm: LaterViewModel = hiltViewModel()){
val videos=vm.watchLater.observeAsState()
val context= LocalContext.current
}
请务必添加以下内容
- 将 androidx.hilt:hilt-navigation-compose 依赖项添加到模块级别 Gradle 文件。检查最新版本(在 1.0.0-alpha03 上测试)。
- @HiltViewModel 到您的 ViewModel。
- @AndroidEntryPoint 使用 Composable 功能的所有者。
我发现最简单的方法是在您的可组合函数中。
添加依赖 implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
then;
@Composable
fun Foo(){
val viewModel : Bar = hiltViewModel()
}
然后你就可以照常使用viewmodel了。
我正在做与文档 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>())
您可以通过 hiltViewModel()
在 Composable 函数中直接使用 ViewModel@Composable
fun WatchLater(vm: LaterViewModel = hiltViewModel()){
val videos=vm.watchLater.observeAsState()
val context= LocalContext.current
}
请务必添加以下内容
- 将 androidx.hilt:hilt-navigation-compose 依赖项添加到模块级别 Gradle 文件。检查最新版本(在 1.0.0-alpha03 上测试)。
- @HiltViewModel 到您的 ViewModel。
- @AndroidEntryPoint 使用 Composable 功能的所有者。
我发现最简单的方法是在您的可组合函数中。
添加依赖 implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
then;
@Composable
fun Foo(){
val viewModel : Bar = hiltViewModel()
}
然后你就可以照常使用viewmodel了。