在Dagger Hilt View Model 1.0.0-alpha03中,Dagger Hilt 'Assisted'和'ViewModelInject'已被弃用。

54

在 Dagger Hilt View Model 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

有什么新的工作方式吗?

5个回答

107

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

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

    // Some code
}

如果我们想要从Fragment传递字符串到ViewModel的构造函数,并且还要注入存储库,该怎么办? - Daniyal Javaid
@DaniyalJavaid 我认为只有两种方法。1)使用SavedStateHandle作为您的片段参数容器(就像答案中一样)。2)创建自己的AssistedFactory。 - Daniil Pavlenko
我们可以使用私有参数吗?有时我会遇到“无法为final”错误。 - Amg91
我的项目有数百个片段,形式为MyFragment:BaseFragment(R.layout.my_layoyut),其中BaseFragment的构造函数具有一些可选参数,如何从Dagger迁移到Hilt? - David

51
在dagger hilt的最新更新中,他们做了一些更改,因此在您的情况下,您可以使用@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....{}

1
请再次查阅文档。你的示例是错误的。@HiltViewModelInject不再需要,因为它已被弃用。 - Andrew
2
你确定吗?因为我们之前只使用了ViewModelInject,但在最新版本中,我们使用HiltViewModel以及Inject来构造viewmodel类。 - Taki
@Andrew 看一下这里,https://dagger.dev/hilt/view-model - Taki
1
也许你应该看看你自己的链接。正如你可以清楚地看到的那样,你的例子是错误的!'@Assisted' 不再需要放在 savedstatehandle 前面,而应该是 '@HiltViewModel',而不是像你写的 '@HiltViewModelInject'。 - Andrew
1
@Andrew,感谢您的澄清,显然是我的错,感谢您的纠正。 - Taki
这是一个很棒的答案。我最近升级了一个旧项目,这个答案救了我的一天。 - Taslim Oseni

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

我已经尝试了这里提到的大多数方法,并添加了一个带有模型视图提供程序API的单独模块,但都没有奏效。在升级时漏掉的一件事是没有改变类路径版本。
因此,为了使其正常工作,我们需要将类路径更新到2.31及以上版本,该版本在您的项目Gradle中已经存在。
classpath "com.google.dagger:hilt-android-gradle-plugin:2.31-alpha"

发布于2021年1月之前的版本不支持最新的@HiltViewModel注释。


0

因此,在项目级别的 gradle 文件中的 dependencies 中将 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() {...}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接