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

Jetpack Compose rememberSaveable() leads to crash when an app goes to background

我已将 compose 版本更新为 1.0.0-beta01,当应用进入后台时遇到崩溃问题

java.lang.RuntimeException: Parcel: unable to marshal value androidx.compose.runtime.SnapshotMutableStateImpl@efa375c at android.os.Parcel.writeValue(Parcel.java:1885) at android.os.Parcel.writeList(Parcel.java:1092) at android.os.Parcel.writeValue(Parcel.java:1832) at android.os.Parcel.writeMapInternal(Parcel.java:943) at android.os.Parcel.writeMap(Parcel.java:925) at android.os.Parcel.writeValue(Parcel.java:1797) at android.os.Parcel.writeMapInternal(Parcel.java:943) at android.os.Parcel.writeMap(Parcel.java:925) at android.os.Parcel.writeValue(Parcel.java:1797) at android.os.Parcel.writeList(Parcel.java:1092) at android.os.Parcel.writeValue(Parcel.java:1832) at android.os.Parcel.writeArrayMapInternal(Parcel.java:975) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1044) at android.os.Parcel.writeValue(Parcel.java:1801) at android.os.Parcel.writeArrayMapInternal(Parcel.java:975) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1044) at android.os.Parcel.writeValue(Parcel.java:1801) at android.os.Parcel.writeArrayMapInternal(Parcel.java:975) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4389) at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

var email by rememberSaveable { mutableStateOf("") }

如果我只是将 rememberSaveable() 更改为 remember() 一切正常。

这是一个错误,其修复将在 beta02 中发布:https://issuetracker.google.com/issues/180042685

那里有一个临时解决方法mentioned,您可以这样做:

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)
    }
)