Реализация обратных вызовов, не зависящих от SDK, во фрагментахAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Реализация обратных вызовов, не зависящих от SDK, во фрагментах

Сообщение Anonymous »

Мой вопрос не касается Android, он скорее зависит от дизайна.
Ранее у меня был 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 (а точнее MapBox или любого другого SDK) чистыми и абстрактными для фрагментов.
Я сделал это. определил некоторые абстрактные пользовательские обратные вызовы на основе обратных вызовов 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»