It looks like the compiler doesn't want to use Kotlinx serialized classes in putSerializable
and getSerializable
.
It says Type mismatch: inferred type is MyViewModel.SavedState but Serializable? was expected
.
In my Activity:
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.my_activity_layout)
viewModel.init(savedInstanceState?.getSerializable(SAVE_STATE) as? SavedState) // compiler complains here
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putSerializable(SAVE_STATE, viewModel.buildSaveState()) // and here
}
In my ViewModel:
fun buildSaveState(): SavedState =
SavedState(value1, value2, value3, value4)
@Serializable
data class SavedState(val foo: Boolean?,
val foo1: Enum1?,
val foo2: Enum2?,
val foo3: MyType?)
MyType:
@Serializable
sealed class MyType {
data class MyType1(val foo4: Enum3) : MyType()
data class MyType2(val foo5: Enum4) : MyType()
enum class Enum3 {
...
}
enum class Enum4 {
...
}
}
I'm pretty sure Kotlinx.Serialization is not OOB compatible with Bundle's putSerializable. However, you could just stringify
your SavedState
, send it via putString
and on the receiving end deserialize string back to your class.