diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt index d514716..f17f7e8 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt @@ -1,6 +1,7 @@ package ru.touchin.roboswag.components.tabbarnavigation import android.os.Bundle +import android.os.Parcel import android.os.Parcelable import android.util.SparseArray import android.view.LayoutInflater @@ -72,14 +73,41 @@ abstract class BottomNavigationFragment : Fragment() { private fun getNavigationActivity() = requireActivity() as BottomNavigationActivity - data class TabData( + class TabData( val viewControllerClass: Class>, - val viewControllerState: Parcelable, + viewControllerState: Parcelable, /** * It can be useful in some cases when it is necessary to create ViewController * with initial state every time when tab opens. */ val saveStateOnSwitching: Boolean = true - ) + ) { + + /** + * It is value as class body property instead of value as constructor parameter to specify + * custom getter of this field which returns copy of Parcelable every time it be called. + * This is necessary to avoid modifying this value if it would be a value as constructor parameter + * and every getting of this value would return the same instance. + */ + val viewControllerState = viewControllerState + get() = field.copy() + + operator fun component1() = viewControllerClass + + operator fun component2() = viewControllerState + + operator fun component3() = saveStateOnSwitching + + private fun Parcelable.copy(): Parcelable { + val parcel = Parcel.obtain() + this.writeToParcel(parcel, 0) + parcel.setDataPosition(0) + val result = parcel.readParcelable(Thread.currentThread().contextClassLoader) + ?: throw IllegalStateException("It must not be null") + parcel.recycle() + return result + } + + } }