Dagger Hilt“辅助”和“ViewModelInject”已弃用。在 Dagger Hilt 查看模型 1.0.0-alpha03

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

在 Dagger Hilt 查看模型 1.0.0-alpha01

    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01"
    implementation 'com.google.dagger:hilt-android:2.28-alpha'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
    kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'

我可以使用下面的

class MyViewModel @ViewModelInject constructor(
    private val repository: Repository,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {

    // Some codes...
}

但是,当我迁移到 Dagger Hilt View Model 1.0.0-alpha03 时

    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    implementation 'com.google.dagger:hilt-android:2.31.2-alpha'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
    kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'

我收到警告

'Assisted' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'Assisted' is deprecated. Deprecated in Java

新的工作方式是什么?

android android-viewmodel dagger-hilt
6个回答
109
投票

在alpha03中,现在使用新的

@HiltViewModel
和普通的
@Inject
,如下所示。

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {

    // Some code
}

53
投票

在匕首柄的上次更新中,他们做了一些更改,因此在您的情况下,您可以使用

@HiltViewModel
@Inject
将其与 ViewModel 一起使用。

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {
    // Some codes...
}

此外,如果您使用的是

ApplicationComponent
,在最新的更新中它已更改为
SingletonComponent

所以在你的模块类中这样。

@Module
@InstallIn(SingletonComponent::class.java)
object hiltmodel....{}

8
投票

@ViewModelInject 已弃用,并已被 @HiltViewModel 取代。

HiltViewModel 注解的 ViewModel 将可供 HiltViewModelFactory 创建。包含带有 Inject 注解的构造函数的 HiltViewModel 将在 Dagger 的 Hilt 注入的构造函数参数中定义其依赖项。 https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel

一个简单的 ViewModel 现在看起来像这样:

@HiltViewModel
class MainViewModel @Inject constructor(application: Application) :
AndroidViewModel(application) {
}

or

@HiltViewModel
class MainViewModel @Inject constructor() :
ViewModel() {
}

whatever your use case might be.

1
投票

将 hilt 升级到 v2.31+ 后出现以下错误?:

2021-04-02 20:05:22.443 3718-3718/com.demo.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.demo.app, PID: 3718
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.demo.app/com.demo.app.ux.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.demo.app.ux.viewmodels.MainViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) .....

尝试了here中提到的大部分内容,还添加了一个带有模型视图提供程序API的单独模块,但是这些都不起作用,升级时错过的一件事就是更改类路径版本。

因此,为了完成这项工作,我们需要将类路径更新为 2.31 及以上版本,该版本存在于您的项目 gradle 中:

classpath "com.google.dagger:hilt-android-gradle-plugin:2.31-alpha"
2021 年 1 月之前的

发布不支持最新的 @HiltViewModel 注释。


0
投票

因此在项目级别gradle中的依赖项中将hilt版本替换为2.33-beta

buildscript{
    ext.hiltVersion = "2.33-beta"
    dependencies{
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
    }
}

并在视图模型类中而不是构造函数之前的 @viewmodelinject 中删除它并执行此操作

@HiltViewModel
class TasksViewModel @Inject constructor(val taskDao: TaskDao) : ViewModel() {...}

0
投票

以防万一有人在 2024 年来到这里,ViewModel 可以直接在可组合函数内部传递,例如(SettingsViewModel 应注释为 @HiltViewModel):

val viewModel: SettingsViewModel = hiltViewModel()

将此类依赖项添加到您的 graddle 文件后:

implementation "androidx.hilt:hilt-navigation-compose:1.1.0"
© www.soinside.com 2019 - 2024. All rights reserved.