【问题标题】:Dagger failing to inject Application contextDagger 无法注入应用程序上下文
【发布时间】:2020-09-01 22:52:09
【问题描述】:

我设置了匕首来管理片段和视图模型。我需要将应用程序上下文传递给我的视图模型,以便实例化并与存储库类通信。当我尝试执行此操作时,我从 dagger 中收到错误消息:

    error: [Dagger/DependencyCycle] Found a dependency cycle:
public abstract interface AppComponent {
                ^
      com.example.framework.BaseApplication is injected at
          com.example.di.AppModule.provideAppContext(application)
      com.example.framework.BaseApplication is injected at
          com.example.di.MainViewModelModule.provideMainViewModelFactory(application, �)
      androidx.lifecycle.ViewModelProvider.Factory is injected at
          com.example.framework.presentation.common.MainFragmentFactory(viewModelFactory)
      com.example.framework.presentation.common.MainFragmentFactory is injected at
          com.example.framework.presentation.main.MainActivity.fragmentFactory
      com.example.framework.presentation.main.MainActivity is injected at

我是 dagger 的新手,所以我正在努力找出这个问题的根本原因以及如何实施修复。对这个问题中的代码量表示歉意,但 dagger 有许多可能存在问题的类。

应用组件

@Component(
    modules = [
        AppModule::class,
        MainViewModelModule::class,
        MainFragmentFactoryModule::class
    ]
 )
 interface AppComponent {

 @Component.Builder
  interface Builder {

      @BindsInstance
      fun application(application: Application): Builder
      fun build(): AppComponent
  }

fun inject(mainActivity: MainActivity)

应用模块

@ExperimentalCoroutinesApi
@FlowPreview
@Module
object AppModule {

@JvmStatic
@Provides
@Singleton
fun provideAppContext(application: BaseApplication): BaseApplication{
    return application
}

查看模型模块

@ExperimentalCoroutinesApi
@FlowPreview
@Module
object MainViewModelModule {

@Singleton
@JvmStatic
@Provides
fun provideMainViewModelFactory(
        application: BaseApplication,
        editor: SharedPreferences.Editor,
        sharedPreferences: SharedPreferences
): ViewModelProvider.Factory{
    return MainViewModelFactory(
            application = application,
            editor = editor,
            sharedPreferences = sharedPreferences
    )
}

查看模型工厂

@FlowPreview
@ExperimentalCoroutinesApi
@Singleton
class MainViewModelFactory
@Inject
constructor(
    private val application: BaseApplication,
    private val editor: SharedPreferences.Editor,
    private val sharedPreferences: SharedPreferences
) : ViewModelProvider.Factory {

override fun <T : ViewModel> create(modelClass: Class<T>): T {
    return when(modelClass){

        ViewModelUsers::class.java -> {
            ViewModelUsers(
                    application = application,
                    editor = editor,
                    sharedPreferences = sharedPreferences
            ) as T
        }

查看模型

@ExperimentalCoroutinesApi
@FlowPreview
@Singleton
class ViewModelUsers
@Inject
constructor(
        application: BaseApplication,
        private val editor: SharedPreferences.Editor,
        sharedPreferences: SharedPreferences
): ViewModel() {
    private var repoUsers = RepoUsers(application)

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

    修复它的方法很多,但最简单的方法是您应该更改为 BaseApplication 并删除 AppModule 类,因为它已经由 @BindsInstance 注释提供

    @Component(
        modules = [
            MainViewModelModule::class,
            MainFragmentFactoryModule::class
        ]
     )
     interface AppComponent {
    
     @Component.Builder
      interface Builder {
    
          @BindsInstance
          fun application(application: BaseApplication): Builder
          fun build(): AppComponent
      }
    
    fun inject(mainActivity: MainActivity)
    

    【讨论】:

    • app 模块有我所有的@provides 用于所有依赖项,如房间、改造、滑行等。我没有把它全部粘贴进去,因为它太大了
    • 所以只能去掉provideAppContext函数
    • 刚刚做了,现在它给出了这个错误:错误:[Dagger/MissingBinding] android.app.Application 不能在没有“@Injec”t 构造函数或@Provides-annotated 方法的情况下提供。跨度>
    • 这意味着您在应用程序中同时使用 Application 和 BaseApplication。你应该选择其中之一
    • 如果您同时需要 Application 和 BaseApplication,请保留您发布的所有代码,仅将此方法 fun provideAppContext(application: BaseApplication) 更改为 fun provideAppContext(application: Application)
    【解决方案2】:

    将存储库注入视图模型解决了这个问题,而不是尝试通过链传递应用程序上下文。

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2017-11-05
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2020-02-29
      相关资源
      最近更新 更多