我有两个使用 ViewModelProvider 的活动,必须注入 Dagger。
要在活动中提供注入,我必须调用 appComponent.inject() 方法。我可以进入 Mainactivity。但是我不能在其他活动中使用它(显然是因为 appComponent.inject() 将 Mainactivity 实例作为参数)。
所以,问题是: 我应该如何处理 AppComponent(或其他),以便能够从不同的活动(不仅是从 Mainactivity)获取 AppComponent 的实例。
附言可能是关于 Dagger Scopes,但我不知道具体要做什么。
AppComponent.kt
...
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun inject(mainactivity: Mainactivity)
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun create(): AppComponent
}
}
Mainactivity.kt
class Mainactivity : AppCompatactivity() {
@Inject
lateinit var viewModelProvider: Provider<MainactivityViewModel.Factory>
private val viewModel: MainactivityViewModel by viewModels { viewModelProvider.get() }
private lateinit var recyclerView : RecyclerView
private val adapter by lazy(LazyThreadSafetyMode.NONE) {
RecyclerViewAdapter(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appComponent.inject(this)
setContentView(R.layout.activity_main)
setupViewModel()
setupUI()
}
private fun setupViewModel(){
viewModelProvider.get()
viewModel.setQuery("Apple")
}
private fun setupUI(){
recyclerView = findViewById(R.id.recyclerView)
GridLayoutManager(this,3,RecyclerView.VERTICAL,false
).apply {
recyclerView.layoutManager = this
}
recyclerView.adapter = adapter
addRepeatingJob(Lifecycle.State.STARTED) {
viewModel.images.collectLatest(adapter::submitData)
}
}
}
ViewPager.kt
class ViewPageractivity : AppCompatactivity() {
@Inject
lateinit var viewModelProvider: Provider<MainactivityViewModel.Factory>
private val viewModel: MainactivityViewModel by viewModels { viewModelProvider.get() }
private lateinit var viewPager: ViewPager2
private val adapter by lazy(LazyThreadSafetyMode.NONE) {
ViewPagerAdapter(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_pager)
Log.d("dbg",intent.getIntExtra("ARG",0).toString())
setupViewModel()
setupUI();
}
private fun setupUI()
{
viewPager = findViewById(R.id.viewPager)
viewPager.adapter = adapter
addRepeatingJob(Lifecycle.State.STARTED) {
viewModel.images.collectLatest(adapter::submitData)
}
}
private fun setupViewModel()
{
viewModelProvider.get()
}
}
谢谢。