提问者:小点点

Dagger Hilt@ViewModelInject已弃用如何在@HiltViewModel中使用@ApplicationContext


我认为这是android studio的问题。它在2天后开始自动工作,也许重新启动android studio就是这样。我使用的是2.31.2-alpha版本。

我在我的ViewModel中使用@ViewModelInject,如下所示,但现在它已被弃用,所以当我尝试使用@HiltViewModel但我不能使用@ApplicationContextinit。

所以我的问题是如何使用我在@HiltViewModel中用@InstallIn(SingletonComponent::class)注释的公共依赖?

如何使用@ApplicationContext@HiltViewModelViewModelComponent::class

我的代码与@ViewModelInject配合使用如下

1. AppModule()

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class SplashApiInterface

@Module
@InstallIn(SingletonComponent::class)
class AppModule() {
    internal var pref_name = Common.pref_name

    @Provides
    @Singleton
    fun mySharedPreference(@ApplicationContext context: Context): SharedPreferences {
        return context.getSharedPreferences(pref_name, Context.MODE_PRIVATE)
    }

    @Provides
    @Singleton
    fun connectionDetector(@ApplicationContext context: Context): ConnectionDetector {
        return ConnectionDetector(context)
    }

    @Provides
    fun myCompositeDisposable(): CompositeDisposable {
        return CompositeDisposable()
    }

    @SplashApiInterface
    @Provides
    @Singleton
    fun mAPIServiceSplash(@ApplicationContext context: Context): ApiInterface {
        return ApiUtils.getAPIServiceSpl(context)
    }

}`

2. SplashVModel

@ActivityScoped
@Singleton
class SplashVModel @ViewModelInject constructor(@ApplicationContext val context: Context,
                                                val sharedPreferences: SharedPreferences,
                                                @SplashApiInterface val mAPIService: ApiInterface,
                                                val myCompositeDisposable: CompositeDisposable,
                                                var cd: ConnectionDetector
) : ViewModel() {
    
    // here I removed use cases of constructor value for brevity

    }

}

那么现在如果我使用@HiltViewModel如何使用SingletonComponent通用函数呢?现在如果创建ViewModelComponent::class那么如何在这个中再次使用那个通用函数呢?那么我该怎么办呢?我必须从SingletonComponent中删除所有常见情况并在每个ViewModel()中单独使用吗?


共3个答案

匿名用户

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

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

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

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

}

现在Hilt提供了一些预定义的限定符。例如,由于您可能需要来自应用程序或活动的Context类,Hilt提供了@ApplicationContext和@ActivityContext限定符。

@HiltViewModel
class MainViewModel @Inject constructor(@ApplicationContext 
private val context: ApplicationContext) :
ViewModel() {

}

匿名用户

Viewmodel不应使用@ActivityScoped或@Singleton进行注释,因为dagger-hert将以一种相当“特殊”的方式提供此实例,而不是像它提供其他依赖项(生命周期和其他东西)那样通常。

首先确保您有以下依赖项并且都是最新的:

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

    implementation "androidx.hilt:hilt-lifecycle-viewmodel:2.32-alpha"

因为你没有提供任何关于什么不“工作”的细节,所以应该:

@HiltViewModel
class YourViewModel @Inject constructor(
    @Applicationcontext context: Context
) : ViewModel()

匿名用户

保持ViewModel不受Activity、Context、Drawables等Android框架引用的影响是一种很好的做法(但不是强制性的)。因此不建议将上下文传递给ViewModel。AndroidViewModel也有同样的问题-它将包含对Android框架的引用。停止将Context传递给ViewModels