В чем разница между ObjectBinding и EnvironmentObject?

Какова цель @EnvironmentObject, когда у нас есть оболочка свойства @Binding? Мне трудно понять, зачем нужен @EnvironmentObject. Я просмотрел эти публикации, но это не совсем то, что я ищу EnvironmentObject в SwiftUIКак использовать BindableObjects (EnviromentObject)?

Я также просмотрел их документацию, которая была слишком тонкой. https://developer.apple.com/documentation/swiftui/environmentobject

Поток данных через SwiftUI, выступление на WWDC 2019 охватывает именно это. EnvironmentObject упоминается в 26:45, хотя я рекомендую посмотреть все выступление.
Alexander 10.09.2019 17:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
1
9 845
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробую объяснить в общих чертах. У нас есть @State, @ObservedObject, @EnvironmentObject и @Binding.

  1. @State - объявляет свойство локального значения. Apple рекомендует использовать их как можно реже, потому что свойство @State должно использоваться только внутри представления и отвечать за мелкие UI вещи.
  2. @ObservedObject — свойство внешней ссылки. На самом деле это ваша модель данных, которая должна отображаться.
  3. @EnvironmentObject — то же, что и @ObservedObject, но используется через окружение для других представлений, тогда как @ObservedObject должен передаваться явно
  4. @Binding - определяет, что свойство не является Источник Истины и является только ссылкой на настоящий Источник Истины (@State, @ObservedObject, @EnvironmentObject). Передача одного из свойств с 1-3 точек в представление просмотра должна объявить свойство в дочернем представлении как @Binding, чтобы создать ссылку и передать свойство со знаком $, например MessageDetails(message: $message) Для получения дополнительной информации рекомендуем посмотреть Поток данных через SwiftUI

УПД: Решил добавить немного важной информации из этой сессии. Вы можете использовать @ObservedObject и @Binding в своих представлениях, но в этом случае вам нужно будет передать привязываемый объект через все ваши представления в нужное представление. @EnvironmentObject и @Environment позволяют передавать привязываемый объект конкретному представлению в иерархии представлений, не передавая объект каждому представлению. На данный момент я не нашел реальных примеров от Apple, поэтому проверяю их сессии

Дополнительно: state обычно является приватным. Как внутреннее состояние просмотра, например. shouldShowView. Для ObservedObject подумайте о состоянии, но о чем-то, что его значение исходит извне вашего объекта и, возможно, о том, что представление также может обновлять значение модели, т.е. это двустороннее. Для EnvironmentObject см. переменные общий, это очень близко к синглтонам. В конечном счете, подумайте о Binding как о чем-то, что является проходом. Не уверен, что это хороший пример, но слабые ссылки никогда не сохраняют память, точно так же Binding не является причиной изменений, а только передает их дальше.

mfaani 28.11.2020 16:23

Другие вопросы по теме