这是android工作室的问题,我想。它开始自动工作后2天,也许重新启动android工作室,这就是它所需要的。我用的是2.31.2-alpha
版本。
我在我的ViewModel中使用@ViewModelInject
,如下所示,但现在它被弃用,所以当我尝试使用@HiltViewModel
,但我不能使用@ApplicationContext
init.
所以我的问题是如何在@HiltViewModel
中使用我用@InstallIn(SingletonComponent::class)
注解的公共依赖项?
如何在@HiltViewModel
、ViewModelComponent::class
中使用@ApplicationContext
?
我的代码与@ViewModelInject
工作正常如下
1.应用程序模块()
@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.飞溅V模型
@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条答案
按热度按时间68de4m5k1#
@ViewModelInject已被弃用,并已替换为@HiltViewModel。
使用HiltViewModel注解的ViewModel将可供HiltViewModelFactory创建。包含使用Inject注解的构造函数的HiltViewModel将在由Dagger的Hilt注入的构造函数参数中定义其依赖项。https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel
一个简单的ViewModel现在看起来像:
现在,Hilt提供了一些预定义的限定符,例如,当您需要应用程序或Activity的Context类时,Hilt提供了@ApplicationContext和@ActivityContext限定符。
wr98u20j2#
视图模型不应该用@ActivityScoped或@Singleton注解,因为dagger-hilt将以一种相当“特殊”的方式提供这个示例,而不是像它提供其他依赖项(生命周期和东西)那样常见。
首先确保您具有以下依赖项,并且这些依赖项都是最新的:
由于您没有提供任何关于哪些方面“不起作用”的详细信息,这应该:
tag5nh1u3#
保持ViewModel不受Android框架引用(如Activity、Context、Drawables等)的影响是一个很好的做法(但不是强制性的),因此不建议将上下文传递给ViewModel。AndroidViewModel也有同样的问题-它将包含对Android框架的引用。Stop passing Context into ViewModels