Ранее у меня был BaseFragment, из которого было получено множество дочерних фрагментов. базовый фрагмент содержал объекты карты Mapbox для обработки карты для функций приложения. через некоторое время компания захотела, чтобы я добавил в проект еще один SDK карт и обрабатывал их обоих во время выполнения с помощью функционального флага. Поэтому я меняю дизайн с этого
Код: Выделить всё
abstract class BaseFragment: MapboxCallBack1,MapBoxCallBacl2 {
val mapBoxMap
val mapView
...
fun config(){
mapBoxMap.addCallback1Listener(this)
mapBoxMap.addCallback2Listener(this)
}
}
Код: Выделить всё
class ChildFragment1 : BaseFragment {
override fun mapBoxCallBackFun1Impl: {
...
}
override fun mapBoxCallBackFun2Impl: {
...
}
}
Код: Выделить всё
class ChildFragment2 : BaseFragment {
override fun mapBoxCallBackFun1Impl: {
...
}
override fun mapBoxCallBackFun2Impl: {
...
}
}
Код: Выделить всё
interface MapProvider {
fun bareMapFeature1()
fun bareMapFeature2()
fun bareMapFeature3()
}
Код: Выделить всё
class MapBoxProviderImpl : MapProvider {
override fun bareMapFeature1(){
...
}
override fun bareMapFeature2(){
...
}
override fun bareMapFeature3(){
...
}
}
Код: Выделить всё
class NewMapSdkProviderImpl : MapProvider {
override fun bareMapFeature1(){
...
}
override fun bareMapFeature2(){
...
}
override fun bareMapFeature3(){
...
}
}
Код: Выделить всё
abstract class BaseFragment {
open val mapProvider: MapProvider
...
}
Код: Выделить всё
class ChildFragment1 : BaseFragment {
override val mapProvider by lazy {
MapProviderFactory.create(mapType)
}
}
Код: Выделить всё
class ChildFragment2 : BaseFragment {
override val mapProvider by lazy {
MapProviderFactory.create(mapType)
}
}
Я сделал это. определил некоторые абстрактные пользовательские обратные вызовы на основе обратных вызовов SDK. заставил базовый фрагмент реализовать его так, чтобы, поскольку базовый фрагмент является абстрактным, дочерние элементы переопределяли их, как и раньше. но на этот раз не обратные вызовы, специфичные для карты. затем переместил каждый обратный вызов, специфичный для карты, в соответствующую реализацию MapProvider, чтобы реализации переопределяли их. затем внедрение этих абстрактных обратных вызовов в конструктор реализаций поставщика карт. тогда реализации поставщика карт могут вызывать собственные методы обратного вызова, когда карта сама вызывает обратные вызовы, специфичные для SDK.
Код: Выделить всё
interface CustomeSdkAgnosticCallBack1 {
fun onClick()
}
Код: Выделить всё
class NewMapSdkProviderImpl(customeCallback1: CustomeSdkAgnosticCallBack1) : MapProvider, MapBoxCallback {
fun config(){
mapbox.addlistener(this)
}
override fun bareMapFeature1(){
...
}
override fun bareMapFeature2(){
...
}
override fun bareMapFeature3(){
...
}
//mapbox specific sdk callback method
override fun onClick(){
customeCallback1.onClick()
}
}
Код: Выделить всё
abstract class BaseFragment, CutomeCallback1 {
open val mapProvider: MapProvider
...
}
Код: Выделить всё
class ChildFragment1 : BaseFragment {
override val mapProvider by lazy {
MapProviderFactory.create(mapType)
}
//custome callback method
override fun onClick(){
//bluf1
//bluf2
}
}
Код: Выделить всё
class ChildFragment2 : BaseFragment {
override val mapProvider by lazy {
MapProviderFactory.create(mapType)
}
//custome callback method
override fun onClick(){
//bluf1
//bluf2
//bluf3
//bluf4
}
}
пожалуйста, дайте свой совет или предложение, как сделать это чистым. Моя цель - сделать базовый фрагмент и дочерние фрагменты чистыми и независимыми от любого SDK или библиотеки карты, пока есть обратные вызовы, в которых дочерние фрагменты должны реагировать на эти обратные вызовы, не зная SDK. и снова я думаю, что ссылка на фрагменты в реализациях карт с помощью обратного вызова custome — это плохо
заранее спасибо
Подробнее здесь: https://stackoverflow.com/questions/798 ... -fragments
Мобильная версия