Using approach `parcel.writeParcelable(this, 0)` instead of `this.writeToParcel(parcel, 0)` resolves the problem.
This commit is contained in:
Daniil Borisovskii 2019-10-25 17:12:35 +03:00
parent 24098d79f1
commit 37f2cf01a0
1 changed files with 15 additions and 6 deletions

View File

@ -10,7 +10,6 @@ import android.view.ViewGroup
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener
import ru.touchin.roboswag.components.navigation.viewcontrollers.EmptyState
import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController
abstract class BottomNavigationFragment : Fragment() {
@ -76,7 +75,7 @@ abstract class BottomNavigationFragment : Fragment() {
class TabData(
val viewControllerClass: Class<out ViewController<*, *>>,
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,18 +83,28 @@ 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 {
private fun <T : Parcelable> Parcelable.copy(): T {
val parcel = Parcel.obtain()
this.writeToParcel(parcel, 0)
parcel.writeParcelable(this, 0)
parcel.setDataPosition(0)
val result = parcel.readParcelable<Parcelable>(Thread.currentThread().contextClassLoader)
?: throw IllegalStateException("It must not be null")
val result = parcel.readParcelable<T>(
javaClass.classLoader ?: Thread.currentThread().contextClassLoader
) ?: throw IllegalStateException("It must not be null")
parcel.recycle()
return result
}