返回

SwiftUI 100天,与@EnvironmentObject携手,畅享跨视图数据共享!

IOS


SwiftUI 的 environment 可以让我们以一种相当优雅的方式共享数据:任何视图都可以把数据发送到环境中,然后任何子视图都可以从环境中读出这些数据。更棒的是,如果一个视图改变对象,所有其他视图都会自动更新 —— 这是一种极为聪明的在大型应用中共享数据的方式。 我们的环境变量包罗万象,从颜色偏好到用户设置,不一而足。本指南将重点讲解如何使用 @EnvironmentObject 在视图间共享数据。

环境变量

如前文所述,环境变量在 SwiftUI 中扮演着举足轻重的角色,它为数据共享提供了极为便利的途径。正是基于这个原因,环境变量在 SwiftUI 中有着广泛的应用,包括:

  • 颜色偏好: 我们可以使用环境变量来存储用户的颜色偏好,然后在整个应用程序中使用这些偏好来定制界面的外观和感觉。
  • 用户设置: 环境变量还可以用来存储用户的其他设置,比如语言偏好、单位偏好等。
  • 数据共享: 环境变量最强大的功能之一是允许我们在视图之间共享数据。这意味着我们可以将数据存储在一个视图中,然后在其他视图中访问这些数据,而无需显式地将数据传递给这些视图。

@EnvironmentObject

@EnvironmentObject 是一个 SwiftUI 属性包装器,允许我们在视图中访问环境变量。为了使用 @EnvironmentObject,我们需要首先创建一个 ObservableObject,这个对象将存储我们要共享的数据。然后,我们可以使用 @EnvironmentObject 来访问这个 ObservableObject,就像访问任何其他属性一样。

代码示例

class MyViewModel: ObservableObject {
    @Published var count = 0
}

struct MyView: View {
    @EnvironmentObject var viewModel: MyViewModel

    var body: some View {
        Text("Count: \(viewModel.count)")
    }
}

在上面的示例中,我们创建了一个名为 MyViewModel 的 ObservableObject,它包含了一个名为 count 的 Published 属性。然后,我们在 MyView 中使用 @EnvironmentObject 来访问 MyViewModel。这允许我们在 MyView 中访问和修改 viewModel.count 的值。

使用技巧

  • 保持数据轻量: 环境变量不应该存储大量数据,因为这会影响性能。
  • 使用 @EnvironmentObject 来共享数据,而不是使用 @State 或 @Binding: @EnvironmentObject 是一种更有效的方式来共享数据,因为它允许我们在视图之间共享数据,而无需显式地将数据传递给这些视图。
  • 使用环境变量来存储用户设置和偏好: 这将使你的应用程序更加灵活,因为用户可以轻松地更改他们的设置和偏好,而无需重新启动应用程序。
  • 遵循命名约定: 为了使代码更易于阅读和维护,请遵循命名约定来命名你的环境变量。例如,你可以使用前缀“env_”来表示环境变量。