【发布时间】:2020-02-05 00:48:44
【问题描述】:
我有一个带有导航抽屉的活动,其中有很多片段。我使用架构组件中的导航库。在每个片段中我都必须写navController = Navigation.findNavController(activity!!, R.id.fragment_container)。我想摆脱这个样板代码。所以我决定用 Dagger 注入它。
@Module
class MainActivityModule {
@ActivityScope
@Provides
fun provideNavController(activity: MainActivity): NavController {
return Navigation.findNavController(activity, R.id.fragment_container)
}
}
@Suppress("unused")
@Module
abstract class ActivityBuildersModule {
@ActivityScope
@ContributesAndroidInjector(
modules = [MainActivityModule::class, MainActivityFragmentBuildersModule::class])
abstract fun contributeMainActivity(): MainActivity
}
注入片段工作正常,但当我尝试注入活动应用程序崩溃:
09-19 19:22:37.152 22342-22342/com.dmitrysimakov.gymlab
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dmitrysimakov.gymlab, PID: 22342
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.dmitrysimakov.gymlab/com.dmitrysimakov.gymlab.MainActivity}:
java.lang.IllegalArgumentException: ID does not reference a View inside this Activity
.....
所以我必须在活动中复制navController = Navigation.findNavController(activity!!, R.id.fragment_container)。有没有更优雅的方法来做到这一点?
【问题讨论】:
-
你能分享一下你为此做了什么吗?目前,我已经在我的 BaseFragment 中初始化了 navController 并在所有片段中使用它。但我想在 ViewModels 中使用它也使用注入。在 ViewModels 中使用导航可以吗?我怎样才能做到这一点?
-
@akshaybhange 不要让 ViewModel 知道 Android 框架类。阅读this article了解更多详情。
-
谢谢 Dmitry,你能分享我如何将 TextWatcher 设置为我的 EditText 吗?它是 android 框架的一部分,我使用的是 ViewModel 本身的 Textwatcher,但我找不到任何好的教程。
-
@akshaybhange 在片段中设置 TextWatcher 并在 TextWatcher 的方法中处理 viewModel 的数据。
-
@akshaybhange 我有 something 类似,但使用 OnQueryTextListener
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { //... override fun onQueryTextChange(newText: String?): Boolean{ viewModel.setSearchText(newText) return true } })
标签: android dagger-2 android-architecture-components