片段中的ViewModel清除屏幕旋转的值

Alg*_*gar 6 android viewmodel android-fragments android-livedata android-architecture-components

猜猜我缺少明显的东西在这里,但......我存储在数据uiModelDiaryViewModel类,因为我使用的架构组件,我期待通过屏幕旋转保留数据-但事实并非如此.我对原因视而不见.

这是一个精简的片段

class DiaryFragment: Fragment() {
    private lateinit var viewModel: DiaryViewModel

    override onCreateView(...) {
        viewModel = ViewModelProviders.of(this).get(DiaryViewModel::class.java)
        viewModel.getModel().observe(this, Observer<DiaryUIModel> { uiModel ->
            render(uiModel)
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的视图模型.

class DiaryViewModel: ViewModel() {
    private var uiModel: MutableLiveData<DiaryUIModel>? = null

    fun getModel(): LiveData<DiaryUIModel> {
        if (uiModel == null) {
            uiModel = MutableLiveData<DiaryUIModel>()
            uiModel?.value = DiaryUIModel()
        }

        return uiModel as MutableLiveData<DiaryUIModel>
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都能看到这个简单例子中缺少的东西吗?现在,uiModel设置为null旋转屏幕时.

Alg*_*gar 14

问题在于活动如何处理片段创建.MainActivity总是在每次旋转时创建一个新片段,如

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    supportFragmentManager
        .beginTransaction()
        .replace(overlay.id, DiaryFragment.newInstance())
        .commit()
}
Run Code Online (Sandbox Code Playgroud)

但是当然,在检查我们是否有一个已保存的实例时,它的效果会更好

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (savedInstanceState == null) {
        supportFragmentManager
            .beginTransaction()
            .replace(overlay.id, DiaryFragment.newInstance())
            .commit()
    }
}
Run Code Online (Sandbox Code Playgroud)