使用ViewModel重新创建片段时如何进行一次获取操作

咖啡时间(休闲时光

我进入FragmentA(),在进入FragmentA()之后,我将数据提取到服务器中,当这些数据到来时,我将填充一个列表。

现在,如果我从FragmentA()转到FragmentB(),然后从FragmentB()按下返回按钮或导航回FragmentA(),它将列表重新获取到服务器并再次填充列表。

我不希望这样做,而是希望我的viewmodel方法不再触发,我正在寻求帮助,sinde Navigation Components不允许我执行.add操作来保存FragmentA()的状态

无论如何,做一次按下操作时,是否将它作为一次一次提取操作而不是每次从FragmentB()到FragmentA()时都进行重新提取?

碎片(个)

 private val viewModel by viewModels<LandingViewModel> {
        VMLandingFactory(
            LandingRepoImpl(
                LandingDataSource()
            )
        )
    }

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val sharedPref = requireContext().getSharedPreferences("LOCATION", Context.MODE_PRIVATE)
        val nombre = sharedPref.getString("name", null)
        location = name!!
    }

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupRecyclerView()
        fetchShops(location)
    }

 private fun fetchShops(localidad: String) {

        viewModel.setLocation(location.toLowerCase(Locale.ROOT).trim())
        viewModel.fetchShopList
            .observe(viewLifecycleOwner, Observer {

                when (it) {

                    is Resource.Loading -> {
                        showProgress()
                    }
                    is Resource.Success -> {
                        hideProgress()
                        myAdapter.setItems(it.data)
                    }
                    is Resource.Failure -> {
                        hideProgress()
                        Toast.makeText(
                            requireContext(),
                            "There was an error loading the shops.",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                }
            })

    }

视图模型

 private val locationQuery = MutableLiveData<String>()

    fun setLocation(location: String) {
        locationQuery.value = location
    }

    fun fetchShopList(shopId:String) = locationQuery.distinctUntilChanged().switchMap { location ->
        liveData(viewModelScope.coroutineContext + Dispatchers.IO) {
            emit(Resource.Loading())
            try{
                emit(repo.getShopList(shopId,location))
            }catch (e:Exception){
                emit(Resource.Failure(e))
            }
        }
        }

如何只在FragmentA()处一次获取这些值,并将这些值保留在viewmodel中,然后在尝试进行重新获取时不再进行此操作?

我很想知道如何使这项工作!

谢谢

恩里克·瓦斯康切洛斯

全能的Google在其最新的更新的最佳实践架构组件github存储库中做到了:

    fun setId(owner: String, name: String) {
        val update = RepoId(owner, name)
        if (_repoId.value == update) {
            return
        }
        _repoId.value = update
    }

这样,即使重新创建了片段,只要viewmodel仍处于活动状态,就不会向服务器请求新数据,但livedata会再次发送其最新数据,以便片段可以更新其视图。

此外,您是否locationQuery.distinctUntilChanged()无法正常工作?您是否正在监视是否将请求发送到服务器?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

重新创建片段时,ViewModel重新获取数据

ViewModel片段在屏幕旋转时重新创建

避免使用哈希图进行片段重新创建

如何防止一次又一次地重新创建新的Fragment?

如何重新创建片段?

片段重新创建后,ViewModel不会保留数据

为什么片段重新创建时onChange()调用了两次

片段重新创建两次

使用tablayout切换片段时重新创建所有片段

Android - 如何在重新创建片段/活动时省略 liveData 的最后一个值?[解决了]

与LINQ一起使用Let时如何避免重新创建对象

重新创建活动时(例如旋转时)如何跟踪ViewPager的选定片段

从多个文件安装存储库,并仅重新创建一次yum缓存

Bootstrap popover销毁和重新创建仅每秒钟一次

如何在viewpager中重新创建片段?

如何在ViewPager中重新创建片段

如何防止Activity重新创建片段

我想还原片段或在重新回到片段时不重新创建它

设置 Django DiscoverRunner 以始终在使用萝卜进行测试时重新创建数据库

有没有一种方法可以防止使用Android导航组件时在bottomNavigation中重新创建片段

重新创建视图后,片段从ViewModel中丢失数据

销毁DataTable并使用新获取的数据重新创建

重新创建包含的片段时,ViewPager中的片段未加载

交换片段时是否总是需要重新创建片段?

在从其他片段上按回时重新创建片段

使用setValue更新Firebase数据时如何停止刷新/重新创建活动?

每当我重新单击或导航到下一个片段时,片段都会不断重新创建

如何使用CSS重新创建tex的过括号

如何使用HTML通过按钮重新创建表?