如何在两个片段之间共享数据?遇到 MVVM 架构问题
How to share data between two fragments? Having trouble with the MVVM architecture
目前我有两个片段,一个显示某个地方的天气,另一个让你 select 地图中的一个点并将你重定向到另一个显示该点天气的片段。
我想要实现的是在默认情况下拥有用户的位置,并通过转到 select 任何其他地方的地图为用户提供选项。所以我想:
- 通过 GPS 获取 lat/lng,然后 "upload" 将其传送到可以在该片段和地图片段之间共享这些值的某个地方(可能是 activity?)
- 如果地图中的一个点 selected 更新这些值 - 两个片段都可以随时读取,只有地图片段可以更新
我相信我可以粗略地将 getters/setters 添加到我的 activity,然后在片段中将 activity 投射到我的特定 activity。但这似乎很糟糕。正确的方法是什么?
我现在拥有的:
- MainActivity(通过底部导航栏连接两个片段)
- ForecastFragment(显示 lat/lng 的天气)
- 预测视图模型
- 地图片段
- 地图视图模型
- 天气资料库
- WeatherAPI(通过 RetroFit 更新值)
我正在使用 dagger 和 kotlin。
谢谢!
使用 activity 范围
在 ForecastFragment
和 MapFragment
之间共享一个公共视图模型
看看这里提供的例子Share data between fragments
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
itemSelector.setOnClickListener { item ->
// Update the UI
}
}
}
class DetailFragment : Fragment() {
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
// Update the UI
})
}
}
注:
Both fragments must handle the scenario where the other fragment is
not yet created or visible.
目前我有两个片段,一个显示某个地方的天气,另一个让你 select 地图中的一个点并将你重定向到另一个显示该点天气的片段。
我想要实现的是在默认情况下拥有用户的位置,并通过转到 select 任何其他地方的地图为用户提供选项。所以我想:
- 通过 GPS 获取 lat/lng,然后 "upload" 将其传送到可以在该片段和地图片段之间共享这些值的某个地方(可能是 activity?)
- 如果地图中的一个点 selected 更新这些值 - 两个片段都可以随时读取,只有地图片段可以更新
我相信我可以粗略地将 getters/setters 添加到我的 activity,然后在片段中将 activity 投射到我的特定 activity。但这似乎很糟糕。正确的方法是什么? 我现在拥有的:
- MainActivity(通过底部导航栏连接两个片段)
- ForecastFragment(显示 lat/lng 的天气)
- 预测视图模型
- 地图片段
- 地图视图模型
- 天气资料库
- WeatherAPI(通过 RetroFit 更新值)
我正在使用 dagger 和 kotlin。
谢谢!
使用 activity 范围
在ForecastFragment
和 MapFragment
之间共享一个公共视图模型
看看这里提供的例子Share data between fragments
class SharedViewModel : ViewModel() { val selected = MutableLiveData<Item>() fun select(item: Item) { selected.value = item } } class MasterFragment : Fragment() { private lateinit var itemSelector: Selector // Use the 'by activityViewModels()' Kotlin property delegate // from the fragment-ktx artifact private val model: SharedViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) itemSelector.setOnClickListener { item -> // Update the UI } } } class DetailFragment : Fragment() { // Use the 'by activityViewModels()' Kotlin property delegate // from the fragment-ktx artifact private val model: SharedViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) model.selected.observe(viewLifecycleOwner, Observer<Item> { item -> // Update the UI }) } }
注:
Both fragments must handle the scenario where the other fragment is not yet created or visible.