我认为这是android studio的问题。它在2天后自动开始工作,也许重启android studio就足够了。我用的是
2.31.2-alpha
版本。
我使用@ViewModelInject
在我的ViewModel如下所示,但现在它已弃用,所以当我试图使用@HiltViewModel
,但我不能使用@ApplicationContext
init.
所以我的问题是如何使用我在@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