Есть ли способ использовать сериализацию Kotlinx в пакете Android savedInstanceState? - PullRequest
0 голосов
/ 19 июня 2020

Похоже, что компилятор не хочет использовать сериализованные классы Kotlinx в putSerializable и getSerializable. Он говорит Type mismatch: inferred type is MyViewModel.SavedState but Serializable? was expected.

В моей деятельности:

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
}

В моей 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 {
        ...
    }
}

1 Ответ

1 голос
/ 19 июня 2020

Я почти уверен, что Kotlinx.Serialization несовместим с запуском OOB с putSerializable из Bundle. Однако вы можете просто stringify свой SavedState, отправить его через putString и на принимающей стороне десериализовать строку обратно в ваш класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...