【问题标题】:How to inject a ViewModel into a composable function using Hilt (Jetpack Compose)如何使用 Hilt (Jetpack Compose) 将 ViewModel 注入可组合函数
【发布时间】:2021-07-14 17:10:42
【问题描述】:

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

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

我的 ViewModel:

@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
    

}

【问题讨论】:

    标签: mvvm viewmodel android-jetpack-compose dagger-hilt


    【解决方案1】:

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

    hiltViewModel<ViewModelType>()
    

    例子:

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

    Developer.Android-Refrence

    【讨论】:

    • 在compose里面简单使用exampleViewModel:ExampleViewModel = viewModel()
    【解决方案2】:

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

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

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

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

    val viewModel: LaterViewModel = hiltNavGraphViewModel<LaterViewModel>()
    WatchLater(viewModel)
    

    【讨论】:

    • 非常感谢,我认为将视图模型限定为导航图是我目前最好的解决方案。
    【解决方案3】:

    您可以通过 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 函数的所有者。

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2022-09-27
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多