使用MVVM在整个应用程序中共享数据



这是一个理论问题。您将如何处理整个应用程序中的共享数据(可能属于ViewModel的数据)?

示例:在我的MainActivityonCreate()中,我在ConnectivityManager上注册了一个NetworkCallback。您会在网络更改时更新哪些数据持有者?所有片段共享的ViewModel的属性(但每个片段/屏幕会有两个ViewModel(如果使用compose)?在活动本身中公开vars

让我们更困难一些,假设我们正在使用Hilt,并且当连接发生变化时,我们需要更新一些属于几个不同ViewModelState

如果我们想使用LiveData/StateFlow呢?

你会怎么做?欢迎您提供任何意见!

编辑:

这就是我所说的结构。

MainActivity
val mainViewModel by viewModels()
onCreate()
ConnectivityManager.registerDefaultCallback() // The callback updates values inside mainViewModel
setContent {} // Here we enter compose world.
NavHost()
BottomSheet(viewModel: BottomSheetViewModel = viewModel())
// Inside here I query viewModel.state to get the state of a web request. 
// This state should take into account the connection state and if none is available it should be State.NO_CONNECTION

基本上,您可以将网络状态(以及其他内容)保存在dataStore类中,然后该类将返回一个流,您可以转换为LiveData。

从那里,您可以订阅流(在ViewModel中)并将其转换为Livedata,然后可以从每个片段中观察到它。

https://www.youtube.com/watch?v=dd_Lv7AxqkY&list=PLrnPJCHvNZuCfAe7QK2BoMPkv2TGM_b0E&索引=7

观看此视频以获得详细解释。

以LiveData的形式获取网络更新(不仅是连接,还有网络有效性)。

您可以添加此类

https://github.com/E5c11/TicTacToe_3D/blob/master/app/src/main/java/com/esc/test/apps/network/ConnectionLiveData.java

它返回一个布尔值,当添加为Singleton(在Dagger中)时,可以在所有类/片段中观察到该值为LiveData。

@Provides
@Singleton
fun provideNetworkReport(Application app) = ConnectionLiveData(app)

然后,您可以使用在ViewModel中调用或注入它

val network: ConnectionLiveData

然后用将其返回到片段

fun getNetwork() = network

相关内容

  • 没有找到相关文章

最新更新