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 9e008be..c1364fc 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 @@ -76,7 +76,7 @@ abstract class BottomNavigationFragment : Fragment() { 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. @@ -84,21 +84,34 @@ abstract class BottomNavigationFragment : Fragment() { 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 - } + private fun Parcelable.copy(): Parcelable = + if (this is EmptyState) { + EmptyState + } else { + val parcel = Parcel.obtain() + parcel.writeParcelable(this, 0) + parcel.setDataPosition(0) + val result = parcel.readParcelable( + javaClass.classLoader ?: Thread.currentThread().contextClassLoader + ) ?: throw IllegalStateException("Failed to copy tab state") + parcel.recycle() + result + } }