找回密码
 立即注册
搜索
1

如何在Android Compose应用程序中使用SharedViewModel?

linchen 2024-7-28 18:58:46 91 显示全部楼层
[md]这个问题已经有了答案:
在Jetpack Compose中定位状态(2个回答)
5小时前关闭。
我正在开发一个Android Compose应用程序。我有许多可复用的屏幕,我正在通过路由在它们之间导航。我为所有屏幕使用一个ViewModel。我在每个屏幕中这样实例化ViewModel:
```

kotlin
val viewModel = viewModel<MyViewModel>()
```
但我看到这些是不同的对象,无法在所有屏幕之间共享数据。如果我在第一个屏幕保存了一些数据,我希望能够使用ViewModel在第二和第三个屏幕中访问它。

我在第一个屏幕中保存数据:

`kotlin
viewModel.saveData()`
回答:
在Jetpack Compose中,如果你想在多个屏幕之间共享数据,你应该确保只创建一个ViewModel实例,并在所有屏幕中使用它。这通常通过依赖注入来实现,例如使用by viewModels()委托属性,它提供了一个ViewModel的单例,该ViewModel将与组件树中的所有Composables共享。

以下是如何在Compose中正确使用ViewModel并共享数据的方法:

确保你的ViewModel是通过ViewModelProvider或by viewModels()创建的,后者是Compose的推荐方式。

使用by viewModels()委托属性,而不是viewModel()函数,这样你就可以在所有屏幕中引用相同的ViewModel实例。

```
kotlin
@Composable
fun MyScreen() {
    val viewModel = viewModel<MyViewModel>()
    // ...
}
```
应该替换为:
```

kotlin
@Composable
fun MyScreen() {
    val viewModel = remember { viewModels<MyViewModel>(owner = LocalViewModelStoreOwner.current) }
    // ...
}
```
如果你使用导航组件,你可以将ViewModel与导航图关联,这样所有通过导航图访问的屏幕都能访问到相同的ViewModel实例。

确保你保存和访问数据的方式是线程安全的,因为ViewModel的LiveData或其他状态观察者可能在后台线程更新数据。

如果你的ViewModel需要持久化数据,考虑使用Room数据库或其他持久化库来存储数据,然后从ViewModel中查询这些数据。

确保在每个屏幕中使用相同的ViewModel实例,并正确设置观察者来响应数据的变化。

通过这种方式,你可以在Compose应用程序中的多个屏幕之间共享和访问数据。

[/md]
回复

使用道具 举报

大神点评1

linchen 发表于:2024-7-28 18:59:18
You should instantiate viewModel in MainScreen or Activity and pass down viewModel to every compose screen.

  1. class MainActivity : ComponentActivity() {
  2.     private val viewModel: YourViewModel()

  3.     override fun onCreate(savedInstanceState: Bundle?) {
  4.     ...
  5.     setContent {
  6.        YourScreen(viewModel)
  7.     }
  8.    }
  9. }

  10. @Composable
  11. fun YourScreen(viewModel: YourViewModel) {}
  12. or

  13. @Composable
  14. fun MainScreen() {
  15.    val viewModel: YourViewModel = viewModel()
  16.    YourScreen(viewModel)
  17. }

  18. @Composable
  19. fun YourScreen(viewModel: YourViewModel) {}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册