[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] |
You should instantiate viewModel in MainScreen or Activity and pass down viewModel to every compose screen.
|