当应用程序进入后台时,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)
}
)
我已将 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)
}
)