我认为这是android studio的问题。它在2天后开始自动工作,也许重新启动android studio就是这样。我使用的是2.31.2-alpha
版本。
我在我的ViewModel中使用@ViewModelInject
,如下所示,但现在它已被弃用,所以当我尝试使用@HiltViewModel
但我不能使用@ApplicationContext
init。
所以我的问题是如何使用我在@HiltViewModel
中用@InstallIn(SingletonComponent::class)
注释的公共依赖?
如何使用@ApplicationContext
在@HiltViewModel
,ViewModelComponent::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()
中单独使用吗?
@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