如何将异步位置数据从宿主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侧:
- 获取与Fragment共享的ViewModel实例:
private val locationViewModel by viewModels<LocationViewModel>() - 在FusedLocationProviderClient的位置回调中,调用ViewModel的更新方法:
override fun onLocationResult(locationResult: LocationResult) { val location = locationResult.lastLocation ?: return locationViewModel.setLocation(location) }
- 获取与Fragment共享的ViewModel实例:
子Fragment侧:
- 获取绑定宿主Activity生命周期的ViewModel实例,确保和Activity用的是同一个:
private val locationViewModel by viewModels<LocationViewModel>(ownerProducer = { requireActivity() }) - 观察位置数据变化,在回调中处理更新:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) locationViewModel.liveLocation.observe(viewLifecycleOwner) { location -> // 在这里处理更新后的位置,比如刷新UI、执行业务逻辑 } }
- 获取绑定宿主Activity生命周期的ViewModel实例,确保和Activity用的是同一个:
内容的提问来源于stack exchange,提问作者mik3.rizzo
相关产品推荐
相关产品推荐

