java使用AppComponent。在不同的活动中注入()(Dagger2)
我有两个使用ViewModelProvider的活动,必须注入Dagger
要在活动中提供注入,我必须调用appComponent。inject()方法。我能赶到这里。但我不能在其他活动中使用它(显然是因为appComponent.inject()将MainActivity实例作为参数)
所以,问题是: 我应该如何使用AppComponent(或使用smth.else),才能从不同的活动(而不仅仅是MainActivity)获取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
}
}
主要活动。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)
}
}
}
寻呼机。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()
}
}
谢谢
# 1 楼答案
AppComponent的生成器接受一个应用程序。您还没有指定如何创建或存储AppComponent,但它可能位于应用程序实例中或静态字段中,以保留其
@Singleton
属性在这种情况下,您可以创建第二个
inject
方法,以类似或不同的方式命名,该方法使用SecondActivity
:每一个都是成员注入方法:Dagger将在编译时检查对象,找出用
@Inject
注释标记的内容,并在调用inject
时调用方法和填充字段。您可以使用相同的组件,也可以使用不同的组件最后,如果您希望能够在一个活动中注入相同的实例,但在不同的活动之间注入不同的实例,那么您可以查看第二个组件(可能是子组件),该组件带有一个类似
@ActivityScope
的范围注释,您可以编写它。你也可以考虑采用刀柄,这将为你管理其中一些范围