这是一个理论问题。您将如何处理整个应用程序中的共享数据(可能属于ViewModel的数据)?
示例:在我的MainActivity
onCreate()
中,我在ConnectivityManager
上注册了一个NetworkCallback
。您会在网络更改时更新哪些数据持有者?所有片段共享的ViewModel的属性(但每个片段/屏幕会有两个ViewModel(如果使用compose)?在活动本身中公开vars
?
让我们更困难一些,假设我们正在使用Hilt
,并且当连接发生变化时,我们需要更新一些属于几个不同ViewModel
的State
。
如果我们想使用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