如果您正在使用一个Activity来托管多个Fragment,并且您还使用Dagger 2来注入Presenter,那么您可以直接将每个Presenter注入到每个Fragment中。
我的使用案例故事
我从几个月前开始使用架构进行项目开发,自从我发现了Android jetpack Navigation Component之后,我开始将所有的应用视图迁移到这种模式。
所以,在这个过程中,我遇到了许多需要重构的情况,而我在这种情况下不知道该怎么做。
由于我从一开始就使用Dagger 2将我的Presenter注入到我的Activity中,所以在使用Fragment时也不会有太大的变化。
我查看了同一个存储库,以了解如何在Fragment中遵循体系结构,如果您只有1个Fragment作为子项,则在主Activity中进行Presenter的实例化确实是一个很好的方法。
问题在于,如果我需要在一个主Activity中拥有多个Fragment,我应该创建每个Presenter的实例并通过我的FragmentManager将其传递到每个Fragment中,我认为这不是我想要的,因为它会增加从主Activity中Presenter的多个实例化。
这导致了一个情况,在我的主Activity中有所有Presenter的多个实例,以及一些接口来处理如果需要分离工作/视图的情况。
在使用多个Fragment的情况下,一种简单的方法就是不考虑主Activity,而是直接将Presenter注入到每个Fragment本身中。
由于使用Dagger,这样做可以使注入更加简洁。
看一个简单的例子。
class MainMenuActivity : BaseActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
inflateMainFragment(savedInstanceState)
}
override fun getLayout(): Int {
return R.layout.activity_main_menu
}
fun inflateMainFragment(savedInstanceState: Bundle?){
if (savedInstanceState == null) {
val fragment = MainMenuFragment()
supportFragmentManager
.beginTransaction()
.add(R.id.nav_host_fragment, fragment)
.commit()
}
}
}
正如您所看到的,这里我没有任何现有呈现器的实例化需求。相反,我只是在每个片段中注入我需要的每个呈现器。
Original Answer翻译成"最初的回答"
class MapsFragment: BaseMapFragment(), MapContract.MapView {
private lateinit var mMap: GoogleMap
@Inject
lateinit var presenter: MapsPresenter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_paseo,container,false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(requireActivity().application as YawpApplication).getAppComponent()?.inject(this)
presenter.attachView(this)
setupToolbar()
setupMap()
}
}
利用Fragment的生命周期,你可以在
onDestroyView()
方法中分离所有的Fragment视图,并且在垃圾收集器运行时节省一些内存空间。"最初的回答"
override fun onDestroyView() {
super.onDestroyView()
presenter.detachView()
presenter.detachJob()
}
我在Google官方的代码库中找到了一个问题,帮助我更好地理解它。
您可以在此处查看:
这里。原始答案为"Original Answer"。
Presenters
在Activity
内部创建,但注册也将在Fragment
内完成。例如,请参阅TaskDetailActivity
:https://github.com/googlesamples/android-architecture/blob/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailActivity.java - 我们的应用程序中也使用MVP,并且以相同的方式进行注册。我认为这样做没有任何问题。 - Darwind