我在构建要通过依赖项注入测试的应用程序时遇到问题。
它似乎与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
}
}