如果没有@Provides注解的方法,则无法提供android.app.Activity

问题描述 投票:0回答:1

我正在尝试实现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 来隔离问题并注释掉不必要的代码,但我得到了同样的错误。

android dependency-injection dagger dagger-hilt
1个回答
0
投票

@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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.