Dagger Hilt @ViewModelInject不赞成在@HiltViewModel中使用@Applicatio



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

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

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

如何在@HiltViewModel,ViewModelComponent::class中使用@ApplicationContext

我的代码与@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()?

@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() :
ViewModel() {
}

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

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

Viewmodel不应该用@ActivityScoped或@Singleton来注释,因为dagger-hilt会以一种相当"特殊"的方式提供这个实例。而不是像往常一样提供其他依赖项(生命周期之类的)。

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

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免于Android框架引用,如Activity, Context, Drawables等。所以不建议将上下文传递给ViewModel。AndroidViewModel也有同样的问题——它会保存一个对Android框架的引用。停止将Context传入ViewModels

相关内容

  • 没有找到相关文章

最新更新