You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将异步位置数据从宿主Activity传递至子Fragment

问题描述

我有一个包含4个标签页的宿主Activity,每个标签页对应一个Fragment。在宿主Activity中,我通过FusedLocationProviderClient收集用户位置,希望将该位置传递给子Fragment。我初步写了这样的ViewModel:

class LocationViewModel : ViewModel() {
    lateinit var location: Location
}

请问如何在宿主Activity设置完location后通知Fragment?

解决方案

使用MutableLiveData可以实现位置更新的自动通知,它具备生命周期感知能力,能确保Fragment在活跃状态时才接收更新,避免内存泄漏或无效回调。修改后的ViewModel如下:

class LocationViewModel : ViewModel()
{
    private val mutableLiveLocation = MutableLiveData<Location>()
    val liveLocation: LiveData<Location> get() = mutableLiveLocation

    fun setLocation(location: Location)
    {
        mutableLiveLocation.value = location
    }
}

具体实现步骤

  • 宿主Activity侧:

    1. 获取与Fragment共享的ViewModel实例:
      private val locationViewModel by viewModels<LocationViewModel>()
      
    2. 在FusedLocationProviderClient的位置回调中,调用ViewModel的更新方法:
      override fun onLocationResult(locationResult: LocationResult) {
          val location = locationResult.lastLocation ?: return
          locationViewModel.setLocation(location)
      }
      
  • 子Fragment侧:

    1. 获取绑定宿主Activity生命周期的ViewModel实例,确保和Activity用的是同一个:
      private val locationViewModel by viewModels<LocationViewModel>(ownerProducer = { requireActivity() })
      
    2. 观察位置数据变化,在回调中处理更新:
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
          super.onViewCreated(view, savedInstanceState)
          locationViewModel.liveLocation.observe(viewLifecycleOwner) { location ->
              // 在这里处理更新后的位置,比如刷新UI、执行业务逻辑
          }
      }
      

内容的提问来源于stack exchange,提问作者mik3.rizzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:10:34