MVVM 架构|为什么不推荐用 Environment 注入 ViewModel
了解为什么不推荐用 Environment 注入 ViewModel,以及它带来的问题。

在 Filmo 项目中,最初我在 App 入口文件中创建一个 ViewModel
实例,并通过.environment()
注入环境:


然后在 View 中通过 @Environment()
获取 ViewModel
实例:

这种方式可以工作,但导致了一个问题。
当在多个 View 试图中调用 ViewModel 时,会导致每次切换时数据重新加载。例如,我在【书籍】和【电影】Tab 之间切换时,每次都需要刷新数据。
这是由于全局共享一个 ViewModel 实例导致的问题。
在每个试图内创建 ViewModel 实例
在每个视图内创建和管理 ViewModel,更符合 MVVM 最佳实践。
// 创建本地实例
@State private var viewModel = BookmarkSearchViewModel()
通过 setupContext 注入依赖
如果 ViewModel 对外部有依赖,可以通过暴露 setupContext 方法来设置依赖。
例如,如果 ViewModel 内部需要访问 SwiftData,可以这样设置依赖:

如果需要依赖于其他 Observable 实例,例如AppState
也可以这样:

在试图加载时调用 initializeViewModel()
方法:
