Если вы используете одно действие для размещения нескольких фрагментов, а также используете Dagger 2 для внедрения необходимого вам презентатора, вы можете напрямую внедрить каждого презентера в каждый фрагмент.
Моя история использования
Я делаю проект с архитектурой с тех пор, как через несколько месяцев я узнал о компоненте навигации Android Jetpack, я начал переносить все представления своего приложения в этот шаблон.
Итак, я столкнулся с большим количеством рефакторинга, выполняя этот процесс, и я был в этой ситуации, когда не знал, что делать с этой ситуацией.
Поскольку я использовал Dagger 2 с начальной точки, чтобы внедрить своих докладчиков в свои действия, это не сильно изменит то же самое, но с фрагментами.
Я наткнулся на тот же репозиторий, чтобы проверить, как архитектура должна была следовать с фрагментами, что действительно является хорошим способом создания экземпляра презентатора внутри активности хоста, если у вас есть только 1 фрагмент в качестве дочернего элемента.
Дело в том, что если мне нужно иметь несколько фрагментов внутри одной активности хоста, я должен создать экземпляр каждого презентатора и передать его через свой FragmentManager внутри каждого фрагмента, и я думаю, что это не то, на что я смотрел, поскольку он добавляет несколько экземпляров ведущий из Host Activity.
Это приводит к одному случаю, имеющему несколько экземпляров внутри моей активности хоста для всех докладчиков, а также некоторые интерфейсы для обработки отсоединения заданий/представлений, если это необходимо.
Один простой способ сделать это с несколькими фрагментами — просто не думать об активности хоста и внедрять презентаторов внутри каждого фрагмента.
Поскольку это делается с помощью 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()
}
}
}
Как видите, здесь у меня нет экземпляров каких-либо презентаторов, которые нужны для всей моей навигации. Вместо этого я просто добавляю каждого ведущего, который мне нужен, внутрь каждого фрагмента.
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()
}
}
А используя жизненный цикл Fragments, вы можете отсоединить все представления Fragments в методе onDestroyView()
, а также сэкономить место в памяти при запуске сборщика мусора.
override fun onDestroyView() {
super.onDestroyView()
presenter.detachView()
presenter.detachJob()
}
Я нашел в официальном репозитории Google вопрос, который помог мне лучше понять его.
Вы можете проверить это здесь
person
Gastón Saillén
schedule
19.07.2019
Presenters
создается внутриActivity
, но регистрация также будет выполняться внутриFragment
. См., например,TaskDetailActivity
: github.com/googlesamples/android-architecture/blob/todo-mvp/ — мы также используем MVP в нашем приложении, и мы регистрация так же. Я не вижу никакой проблемы в том, чтобы сделать это так. - person Darwind   schedule 15.03.2017