gpt4 book ai didi

android - fragment 中的 ViewModel 清除屏幕旋转时的值

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:31:41 24 4
gpt4 key购买 nike

我想我在这里遗漏了一些明显的东西,但是......我将数据存储在 DiaryViewModel 类的 uiModel 中,并且由于我使用架构组件,所以我希望通过屏幕旋转保留数据 - 但事实并非如此。我不知道为什么。

这是一个精简的 fragment

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

以及相应的 View 模型。

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

有人能看出这个简单示例中缺少什么吗?现在,uiModel 在旋转屏幕时设置为 null

最佳答案

问题在于 Activity 如何处理 fragment 创建。 MainActivity 总是在每次旋转时创建一个新 fragment ,如

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

supportFragmentManager
.beginTransaction()
.replace(overlay.id, DiaryFragment.newInstance())
.commit()
}

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

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

if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(overlay.id, DiaryFragment.newInstance())
.commit()
}
}

关于android - fragment 中的 ViewModel 清除屏幕旋转时的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48150846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com