android 不推荐使用匕首柄@ViewModelInject如何在@HiltViewModel中使用@ApplicationContext

huwehgph  于 2023-02-27  发布在  Android
关注(0)|答案(3)|浏览(220)

这是android工作室的问题,我想。它开始自动工作后2天,也许重新启动android工作室,这就是它所需要的。我用的是2.31.2-alpha版本。
我在我的ViewModel中使用@ViewModelInject,如下所示,但现在它被弃用,所以当我尝试使用@HiltViewModel,但我不能使用@ApplicationContext init.

所以我的问题是如何在@HiltViewModel中使用我用@InstallIn(SingletonComponent::class)注解的公共依赖项?
如何在@HiltViewModelViewModelComponent::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()中单独使用?

68de4m5k

68de4m5k1#

@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提供了一些预定义的限定符,例如,当您需要应用程序或Activity的Context类时,Hilt提供了@ApplicationContext和@ActivityContext限定符。

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

}
wr98u20j

wr98u20j2#

视图模型不应该用@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()
tag5nh1u

tag5nh1u3#

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

相关问题