Kotlin中的Dagger2依赖项注入错误

时间:2019-07-23 12:01:39

标签: android kotlin dependency-injection dagger-2

我在构建要通过依赖项注入测试的应用程序时遇到问题。

它似乎与dagger2有关,并导致调用片段进入主要活动时出错

我尝试调试它并搜索类似的错误,但似乎没有任何效果!

这是我的代码:

应用程序组件:

@Module
abstract class ActivityBindingModule {
  @ContributesAndroidInjector(modules = arrayOf(MainFragmentBindingModule::class))
  abstract fun bindMainActivity(): MainActivity
}

MainFragmentBindingModule:

@Module
abstract class MainFragmentBindingModule {
   @ContributesAndroidInjector
   abstract fun provideListFragment(): ListFragment

   @ContributesAndroidInjector
   abstract fun provideDetailsFragment(): RepoDetailsFragment
 }

ViewModelModule:

@Module
abstract class ViewModelModule {

  @Binds
  @IntoMap
  @ViewModelKey(ListViewModel::class)
  internal abstract fun bindListViewModel(listViewModel: ListViewModel): ViewModel

  @Binds
  @IntoMap
  @ViewModelKey(DetailsViewModel::class)
  internal abstract fun bindDetailsViewModel(detailsViewModel: DetailsViewModel): ViewModel

  @Binds
  internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}

ListFragment

class ListFragment : BaseFragment(), RepoSelectedListener {

   @BindView(R.id.repoRecyclerView)
   lateinit var listView: RecyclerView
   @BindView(R.id.tv_error)
   lateinit var errorTextView: TextView
   @BindView(R.id.loading_view)
   lateinit var loadingView: View


   @Inject
   lateinit var viewModelFactory: ViewModelFactory

   private var viewModel: ListViewModel? = null

   override fun layoutRes(): Int {
      return R.layout.screen_list
   }

   override fun onViewCreated(@NonNull view: View, @Nullable savedInstanceState: Bundle?) {

    viewModel = ViewModelProviders.of(this, viewModelFactory).get(ListViewModel::class.java)

    listView.addItemDecoration(DividerItemDecoration(getBaseActivity()!!, DividerItemDecoration.VERTICAL))
    listView.adapter = RepoListAdapter(viewModel!!, this, this)
    listView.layoutManager = LinearLayoutManager(context)

    observableViewModel()
  }

override fun onRepoSelected(repo: Repo) {
    val detailsViewModel = ViewModelProviders.of(getBaseActivity()!!, viewModelFactory).get(DetailsViewModel::class.java)
    detailsViewModel.setSelectedRepo(repo)
    getBaseActivity()!!.supportFragmentManager.beginTransaction().replace(R.id.screenContainer, RepoDetailsFragment())
            .addToBackStack(null).commit()
 }

private fun observableViewModel() {
    viewModel?.getRepos()?.observe(this, Observer<List<Repo>>{ repos -> if (repos != null) listView.visibility = View.VISIBLE })

    viewModel?.getError()?.observe(this, Observer<Boolean>{ isError ->
        if (isError != null)
            if (isError) {
                errorTextView.visibility = View.VISIBLE
                listView.visibility = View.GONE
                errorTextView.text = getString(R.string.error_load_data)
            } else {
                errorTextView.visibility = View.GONE
                errorTextView.text = null
            }
    })

    viewModel?.getLoading()?.observe(this, Observer<Boolean>{ isLoading ->
        if (isLoading != null) {
            loadingView.visibility = if (isLoading) View.VISIBLE else View.GONE
            if (isLoading) {
                errorTextView.visibility = View.GONE
                listView.visibility = View.GONE
            }
        }
    })
 }

}

这是错误消息:

07-23 12:30:38.836 17616-17616/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.carllewis14.repos, PID: 17616
                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carllewis14.repos/com.carllewis14.repos.ui.MainActivity}: java.lang.IllegalArgumentException: No injector factory bound for Class<com.carllewis14.repos.ui.ListFragment>
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2452)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
                                                       at android.app.ActivityThread.access$900(ActivityThread.java:155)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                       at android.os.Looper.loop(Looper.java:152)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5497)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                    Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<com.carllewis14.repos.ui.ListFragment>
                                                       at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:104)
                                                       at dagger.android.support.AndroidSupportInjection.inject(AndroidSupportInjection.java:74)
                                                       at dagger.android.support.DaggerFragment.onAttach(DaggerFragment.java:38)
                                                       at com.carllewis14.repos.base.BaseFragment.onAttach(BaseFragment.kt:37)
                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1404)
                                                       at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
                                                       at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
                                                       at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
                                                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
                                                       at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
                                                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
                                                       at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
                                                       at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
                                                       at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
                                                       at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
                                                       at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
                                                       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1277)
                                                       at android.app.Activity.performStart(Activity.java:6306)
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2415)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 
                                                       at android.app.ActivityThread.access$900(ActivityThread.java:155) 
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) 
                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                       at android.os.Looper.loop(Looper.java:152) 
                                                       at android.app.ActivityThread.main(ActivityThread.java:5497) 
                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

编辑: 这是应用程序类 类BaseApplication:DaggerApplication(){

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    val component = DaggerApplicationComponent.builder().application(this).build()
    component.inject(this)
    return component
}

}

这是应用程序组件:

 @Singleton
 @Component(modules = [(ContextModule::class), 
 (NetworkModule::class), (AndroidSupportInjectionModule::class), 
 (ActivityBindingModule::class)])
  interface ApplicationComponent : 
    AndroidInjector<DaggerApplication> {

/**
 *
 * Inject dependencies into Base Application
 */
fun inject(application: BaseApplication)

@Component.Builder
interface Builder {

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

}

0 个答案:

没有答案