Site icon AppTractor

Поваренная книга SwiftUI: лучшие практики управления состояниями в SwiftUI

Эффективное управление состояниями — ключ к созданию стабильных и отзывчивых приложений в SwiftUI. Ниже приведены некоторые лучшие практики управления состоянием в ваших приложениях SwiftUI:

  1. Используйте State и Binding для простых локальных состояний. State и Binding идеально подходят для управления простым состоянием, которое локально для представления или может быть передано от родительского представления к дочернему. Помните, что эти обертки свойств предназначены для работы с типами значений.
  2. Для сложных состояний используйте ObservedObject и Published. Если у вас есть более сложное состояние, которое может быть общим для нескольких представлений, рассмотрите возможность использования ObservedObject и Published в сочетании с отдельным классом управления состоянием.
  3. Используйте EnvironmentObject для совместного использования состояния в несвязанных представлениях. Если вам нужно разделить состояние между несколькими представлениями, которые не связаны напрямую через отношения родитель-ребенок, EnvironmentObject может быть хорошим выбором.
  4. Избегайте больших State переменных. Хранение большого количества данных в State переменных  может привести к проблемам с производительностью, поскольку SwiftUI пересоздает представление при каждом изменении состояния.
  5. Отложите сложные вычисления и побочные эффекты. Избегайте выполнения сложных вычислений или побочных эффектов, например сетевых запросов, непосредственно в структурах представления.

Давайте проиллюстрируем эти лучшие практики на примере простого приложения менеджера задач:

class TaskManager: ObservableObject {
  @Published var tasks = [String]()

  func addTask(_ task: String) {
    tasks.append(task)
  }
}

struct TaskListView: View {
  @EnvironmentObject var taskManager: TaskManager
  @State private var newTask = ""

  var body: some View {
    NavigationStack {
      VStack {
        TextField("New task", text: $newTask)
          .onSubmit {
            if !newTask.isEmpty {
              taskManager.addTask(newTask)
              newTask = ""
            }
          }
          .padding()
        List(taskManager.tasks, id: \.self) { task in
          Text(task)
        }
      }
      .navigationTitle("Task List")
    }
  }
}

struct ContentView: View {
  @StateObject var taskManager = TaskManager()
  
  var body: some View {
    TaskListView()
      .environmentObject(taskManager)
  }
}

Ваш предварительный просмотр должен выглядеть следующим образом:

Этот простой менеджер задач иллюстрирует несколько техник управления состоянием SwiftUI.

В этом примере вы создаете класс TaskManager, который управляет списком задач. Это ObservableObject, что означает, что SwiftUI будет следить за изменениями его свойств Published и обновлять все представления, которые зависят от этих свойств. TaskListView использует EnvironmentObject для доступа к общему TaskManager и State для свойства newTask, которое является локальным для этого представления. Когда в текстовом поле фиксируется новая задача, она добавляется в диспетчер задач, а текстовое поле очищается.

← Предыдущая статья: Создание и доступ к переменным окружения в SwiftUI

Источник

Exit mobile version