@JvmField @State internal var carName: String? = null
@State String carName;
abstract class InstanceStateProvider<T>(protected val savable: Bundle) { protected var cache: T? = null operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { cache = value if (value == null) return when (value) { is Int -> savable.putInt(property.name, value) is Long -> savable.putLong(property.name, value) is Float -> savable.putFloat(property.name, value) is String -> savable.putString(property.name, value) is Bundle -> savable.putBundle(property.name, value) is Parcelable -> savable.putParcelable(property.name, value) // whatever you want } } }
class Nullable<T>(savable: Bundle) : InstanceStateProvider<T>(savable) { operator fun getValue(thisRef: Any?, property: KProperty<*>): T? { if (cache != null) return cache if (!savable.containsKey(property.name)) return null return savable.get(property.name) as T } } class NotNull<T>(savable: Bundle, private val defaultValue: T) : InstanceStateProvider<T>(savable) { operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return cache ?: savable.get(property.name) as T ?: defaultValue } }
private val savable = Bundle() override fun onCreate(savedInstanceState: Bundle?) { if(savedInstanceState != null) { savable.putAll(savedInstanceState.getBundle("_state")) } super.onCreate(savedInstanceState) } override fun onSaveInstanceState(outState: Bundle) { outState.putBundle("_state", savable) super.onSaveInstanceState(outState) }
protected fun <T> instanceState() = InstanceStateProvider.Nullable<T>(savable) protected fun <T> instanceState(defaultValue: T) = InstanceStateProvider.NotNull(savable, defaultValue)
private var carName: String? by instanceState() private var index by instanceState(0)
Source: https://habr.com/ru/post/336994/
All Articles