MVVM 架构|为什么不推荐用 Environment 注入 ViewModel

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

MVVM 架构|为什么不推荐用 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() 方法: