我正在尝试实现inapp-updates,我的Activity有一个ViewModel,我向它添加了一个方法“checkAppUpdates”,该方法调用“CheckAppUpdateUseCase”,该方法将AppUpdateManager作为构造函数参数,然后调用其checkForAppUpdates来执行实际检查对于更新,实现需要将“Activity”或“ActivityResultLauncher”的实例传递给 google AppUpdateManager的startUpdateFlow或startUpdateFlowForResult方法分别 我的问题是将 Activity 作为构造函数参数注入到我的 AppUpdateManager 但它不起作用,我收到此构建错误>
MyApplication_HiltComponents.java:186:错误:[Dagger/MissingBinding] @dagger.hilt.android.qualifiers.ActivityContext android.app.Activity 无法在没有 @Provides 注释的方法的情况下提供。公共抽象静态类 SingletonC 实现 FragmentGetContextFix.FragmentGetContextFixEntryPoint,
缺少绑定用法: @dagger.hilt.android.qualifiers.ActivityContext android.app.Activity 被注入 com.my.app.AppUpdateManager(活动) com.my.app.AppUpdateManager 被注入 com.my.app.CheckAppUpdateUseCase(appUpdateManager) com.my.app.CheckAppUpdateUseCase 被注入 com.my.app.MainViewModel(..., checkAppUpdateUseCase, ...) com.my.app.MainViewModel 被注入 com.my.app.MainViewModel_HiltModules.BindsModule.binds(arg0) @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map
> 请求于 dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.my.app.MyApplication_HiltComponents.SingletonC → com.my.app.MyApplication_HiltComponents.ActivityRetainedC → com.my.app.MyApplication_HiltComponents.ViewModelC]
我有这样的活动
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
private val viewModel by viewModels<MainViewModel>()
...
视图模型
@HiltViewModel 类 MainViewModel @Inject 构造函数( private val logoutUseCase: LogoutUseCase, private val checkAppUpdateUseCase: CheckAppUpdateUseCase, ...
用例
class CheckAppUpdateUseCase @Inject constructor(
private val appUpdateManager: AppUpdateManager
) {
suspend operator fun invoke() {
appUpdateManager.checkForAppUpdates()
}
}
AppUpdateManager
private const val UPDATE_PRIORITY_HIGH = 4
class AppUpdateManager @Inject constructor(private val activity: Activity) {
suspend fun checkForAppUpdates() {
// use the activity here
}
}
我提供了这样的AppUpdateManager
import android.app.Activity
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext
import com.my.app.AppUpdateManager
@Module
@InstallIn(ActivityComponent::class)
object UpdateManagerModule {
@Provides
fun provideActivity(@ActivityContext activity: Activity) = activity
@Provides
fun provideUpdateManager(@ActivityContext activity: Activity): AppUpdateManager {
return AppUpdateManager(activity)
}
}
我尝试直接注入 Activity 来隔离问题并注释掉不必要的代码,但我得到了同样的错误。
@ActivityContext
为您提供 Context
,而不是 Activity
直接。
@Module
@InstallIn(ActivityComponent::class)
object UpdateManagerModule {
@Provides
fun provideActivity(@ActivityContext activityContext: Context): Activity = activityContext as Activity
@Provides
fun provideUpdateManager(activity: Activity): AppUpdateManager {
return AppUpdateManager(activity)
}
}