匕首柄 'Assisted' 和 'ViewModelInject' 已弃用。在匕首柄视图模型 1.0.0-alpha03

Dagger Hilt 'Assisted' and 'ViewModelInject' is deprecated. in Dagger Hilt View Model 1.0.0-alpha03

在匕首柄视图模型 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

新的工作方式是什么?

在 alpha03 中,现在使用新的 @HiltViewModel 和正常的 @Inject,如下所示。

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

    // Some code
}

在匕首刀柄的上次更新中,他们做了一些改动,因此在您的情况下,您可以使用 @HiltViewModel@Inject 将其与 ViewModel 一起使用。

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

此外,如果您使用的是 ApplicationComponent,在最新更新中它已更改为 SingletonComponent
所以在你的模块中 class 这样。

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

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

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

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

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

将刀柄升级到 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,但是其中 none 的工作在升级时遗漏了一件事情,那就是更改类路径版本也是。

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

classpath "com.google.dagger:hilt-android-gradle-plugin:2.31-alpha"

releases 2021 年 1 月之前不支持最新的 @HiltViewModel 注释。

@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.