Любое улучшение кода при добавлении / замене фрагмента

Я начал изучать Котлин и не знаю всей функциональности языка.

Эта функция используется для отображения фрагмента в FrameLayout. Логика такова, что в первый раз он всегда должен add() фрагмент, а в следующий раз он replace() . Также в некоторых случаях мне нужно использовать addToBackStack() а также в тех же ситуациях, чтобы отключить меню слева.

 fun showFragment(fragment : Fragment, isReplace: Boolean = true, backStackTag: String? = null, isEnabled: Boolean = true) { /* Defining fragment transaction */ val fragmentTransaction = supportFragmentManager .beginTransaction() /* Select if to replace or add a fragment */ if(isReplace) fragmentTransaction.replace(R.id.frameLayoutContent, fragment, backStackTag) else fragmentTransaction.add(R.id.frameLayoutContent, fragment) /* Select if to add to back stack */ if(backStackTag != null) fragmentTransaction.addToBackStack(fragment.javaClass.name) fragmentTransaction.commit() enableDrawer(isEnabled) } 

Вопрос: Существуют ли какие-либо возможные улучшения функционального кода, связанные с спецификациями языка Котлин, чтобы сделать код более чистым, так как теперь функция выглядит как масса.

Мне нравится использовать и позволять, когда у меня есть код, связанный с использованием большого количества переменных и нулевых проверок

Поэтому я бы сделал что-то вроде этого:

 fun showFragment(fragment : Fragment, isReplace: Boolean = true, backStackTag: String? = null, isEnabled: Boolean = true) { /* Defining fragment transaction */ with(supportFragmentManager.beginTransaction()) { /* Select if to replace or add a fragment */ if(isReplace) replace(R.id.frameLayoutContent, fragment, backStackTag) else add(R.id.frameLayoutContent, fragment) /* Select if to add to back stack */ backStackTag?.let { addToBackStack(it) } commit() } enableDrawer(isEnabled) } 

Я опубликовал блог о нижнем ответе.

Я напишу функцию Extension function для FragmentManager которая принимает Lambda with Receiver в качестве аргумента.

 inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) { val fragmentTransaction = beginTransaction() fragmentTransaction.func() fragmentTransaction.commit() } 

Чтобы добавить fragment , мы можем вызвать это сейчас из Activity :

 supportFragmentManager.inTransaction { add(R.id.frameLayoutContent, fragment) } 

Преимущество этого заключается в том, что нам не нужно вызывать beginTransaction() и commit() каждый раз, когда мы добавляем или заменяем Fragment . Сколько часов вы потратили впустую на отладку, чтобы узнать, что вы пропустили вызов commit() в Java?

Затем я напишу Extension functions для AppCompatActivity :

 fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int, backStackTag: String? = null) { supportFragmentManager.inTransaction { add(frameId, fragment) backStackTag?.let { addToBackStack(fragment.javaClass.name) } } } fun AppCompatActivity.replaceFragment(fragment: Fragment, frameId: Int, backStackTag: String? = null) { supportFragmentManager.inTransaction { replace(frameId, fragment) backStackTag?.let { addToBackStack(fragment.javaClass.name) } } } 

Так что теперь мы можем добавлять / заменять Fragment из любой Activity в одной строке без каких-либо дополнительных квалификаторов:

 addFragment(yourFragment, R.id.frameLayoutContent, "tag") replaceFragment(yourFragment, R.id.frameLayoutContent, "tag") 

Все отлично. Вероятно, здесь

 if(backStackTag != null) fragmentTransaction.addToBackStack(fragment.javaClass.name) 

вы хотите добавить фрагмент, используя backStackTag как это

 if(backStackTag != null) fragmentTransaction.addToBackStack(backStackTag) 
Intereting Posts
Что такое модуль Котлина? Возможно ли, чтобы Java создала перегрузку метода с аргументами по умолчанию, такими как Kotlin? Частный конструктор в Котлине Доступ к статической функции расширения из другого класса в Котлине? Kotlin Kapt: java.lang.IllegalStateException: endPosTable уже установлен MutableLiveData с многократным укладом Kotlin Generic не работает Как заставить MockWebServer работать? Ошибка компиляции в Eclipse в проекте Kotlin + Java, но проект строится с Maven Kotlin с пакетом RxKotlinFX дает Не удается получить доступ к ошибке класса Унаследованные декларации платформы сталкиваются при расширении класса Java в Котлине Исключенное исключение при сжатии растрового изображения внутри AsyncTask не останавливает выполнение Интерфейсы Kotlin экспортируют в Javascript отсутствующие свойства Statusbar не прозрачен, но белый Kotlin val различие getter override vs assign Как я могу вернуть логическое значение из AsyncTask?