【问题标题】:Viewmodel data lost on rotationViewmodel 数据在旋转时丢失
【发布时间】:2021-09-02 17:04:12
【问题描述】:

我一直在为一个项目使用 androids viewmodel。在我的项目中,我有两个共享视图模型的片段。在片段 1 (ManageListsFragment) 中显示了视图模型的内容,用户可以导航到片段 2 (AddListFragment),在其中可以对内容进行更改。片段包含在同一个简单的活动中。

在片段 2 中进行更改,然后返回片段 1 时,更改显示没有问题。但是,当我在片段 1 中旋转屏幕时,片段 2 中所做的更改会丢失。到底是怎么回事?视图模型不会持续存在并保留更改吗?

以下是理解我的问题所需的基本代码。

片段 1:


class ManageListsFragment : Fragment() {

    private lateinit var viewBinding: FragmentManageListsBinding
    private val lists: ListsViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        viewBinding =
            DataBindingUtil.inflate(inflater, R.layout.fragment_manage_lists, container, false)

        // Blah blah blah

        viewBinding.addListButton.setOnClickListener {
            findNavController().navigate(R.id.action_manageListsFragment_to_addListFragment)
        }
        return viewBinding.root
    }
}

片段 2:

class AddListFragment : Fragment() {

    private lateinit var lists: ListsViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lists = ViewModelProvider(requireActivity()).get(ListsViewModel::class.java)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        viewBinding =
            DataBindingUtil.inflate(inflater, R.layout.fragment_add_list, container, false)
        // Blah blah blah

        return viewBinding.root
    }

    /***
     * Helper function for adding the list to the list of lists
     */
    private fun addList() {
        // Do changes to lists
        requireActivity().onBackPressed()
    }
}

提前致谢!

【问题讨论】:

  • 你应该看看 koin.io sharedViewModel()
  • 能给个链接吗?谷歌搜索时,我只发现一堆对 ViewModel 的引用。
  • 对,我去看看。谢谢!
  • Koin 不好。不要用那个。您可能只是在创建/获取活动 ViewModel 时做错了。

标签: android kotlin android-fragments viewmodel


【解决方案1】:

解决方案是让底层活动将视图模型数据保存在其 onPause 函数中。

【讨论】:

    【解决方案2】:

    我读到,如果您执行 new Intent 然后启动相同的 Activity,则不会保存 ViewModel。文档是这样说的:https://developer.android.com/topic/libraries/architecture/saving-states

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多