Jetpack Compose rememberSaveable()会导致应用程序进入后台时崩溃 &



我已经将compose版本更新到1.0.0-beta01,当应用程序进入后台时面临崩溃

. lang。RuntimeException: Parcel:无法封送值androidx.compose.runtime.SnapshotMutableStateImpl@efa375candroid.os.Parcel.writeValue (Parcel.java: 1885)android.os.Parcel.writeList (Parcel.java: 1092)android.os.Parcel.writeValue (Parcel.java: 1832)android.os.Parcel.writeMapInternal (Parcel.java: 943)android.os.Parcel.writeMap (Parcel.java: 925)android.os.Parcel.writeValue (Parcel.java: 1797)android.os.Parcel.writeMapInternal (Parcel.java: 943)android.os.Parcel.writeMap (Parcel.java: 925)android.os.Parcel.writeValue (Parcel.java: 1797)android.os.Parcel.writeList (Parcel.java: 1092)android.os.Parcel.writeValue (Parcel.java: 1832)android.os.Parcel.writeArrayMapInternal (Parcel.java: 975)android.os.BaseBundle.writeToParcelInner (BaseBundle.java: 1620)android.os.Bundle.writeToParcel (Bundle.java: 1303)android.os.Parcel.writeBundle (Parcel.java: 1044)android.os.Parcel.writeValue (Parcel.java: 1801)android.os.Parcel.writeArrayMapInternal (Parcel.java: 975)android.os.BaseBundle.writeToParcelInner (BaseBundle.java: 1620)android.os.Bundle.writeToParcel (Bundle.java: 1303)android.os.Parcel.writeBundle (Parcel.java: 1044)android.os.Parcel.writeValue (Parcel.java: 1801)android.os.Parcel.writeArrayMapInternal (Parcel.java: 975)android.os.BaseBundle.writeToParcelInner (BaseBundle.java: 1620)android.os.Bundle.writeToParcel (Bundle.java: 1303)在android.app.IActivityTaskManager存根Proxy.activityStopped美元(IActivityTaskManager.java: 4389)android.app.servertransaction.PendingTransactionActions StopInfo.run美元(PendingTransactionActions.java: 145)android.os.Handler.handleCallback (Handler.java: 938)android.os.Handler.dispatchMessage (Handler.java: 99)android.os.Looper.loop (Looper.java: 223)android.app.ActivityThread.main (ActivityThread.java: 7656)在java.lang.reflect.Method。调用(本地方法)com.android.internal.os.RuntimeInit MethodAndArgsCaller.run美元(RuntimeInit.java: 592)com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 947)

var email by rememberSaveable { mutableStateOf("") }

如果我把rememberSaveable()改为remember(),一切都可以正常工作。

这是一个bug,将在beta02中修复:https://issuetracker.google.com/issues/180042685

这里有一个临时的解决方法,你可以这样做:

var email by rememberSaveable(saver = stateSaver()) { mutableStateOf("") }

其中stateSaver()定义为:

fun <T> stateSaver() = Saver<MutableState<T>, Any>(
save = { state -> state.value ?: "null" },
restore = { value ->
@Suppress("UNCHECKED_CAST")
mutableStateOf((if (value == "null") null else value) as T)
}
)

最新更新