SwiftUI中的EnvironmentObject

时间:2019-06-08 17:30:48

标签: dataflow swiftui

据我所知,我应该能够使用EnvironmentObject从层次结构的任何视图中观察和访问模型数据。我有一个类似的视图,在其中显示LinkListStore中的数组列表。当我打开AddListView并添加一个项目时,它会正确刷新带有已添加项目的ListsView。但是,如果使用PresentationButton进行演示,则必须执行AddListView()。environmentObject(listStore),否则在显示AddListView时会崩溃。我的基本假设是正确的(并且这很可能是错误,这是行为)还是我误解了EnvironmentObject的使用?

基本上:@State将变量绑定到同一View中的视图(例如,将$ text绑定到TextField),@ ObjectBinding / BindableObject将变量绑定到其他View,以及EnvironmentObject与@ObjectBinding相同,但不传递每次都存储对象。有了这个,我应该能够从多个视图向数组添加新项目,并且仍然可以正确刷新列表视图?否则,我不会得到ObjectBinding和EnvironmentObject之间的区别。

struct ListsView : View {

@EnvironmentObject var listStore: LinkListStore

var body: some View {
    NavigationView {
        List {

            NavigationButton(destination: AddListView()) {
                HStack {
                    Image(systemName: "plus.circle.fill")
                        .imageScale(.large)
                    Text("New list")
                }
            }

            ForEach(listStore.lists) { list in
                HStack {
                    Image(systemName: "heart.circle.fill")
                        .imageScale(.large)
                        .foregroundColor(.yellow)
                    Text(list.title)
                    Spacer()
                    Text("\(list.linkCount)")
                }
            }
            }.listStyle(.grouped)
        }

    }
}

#if DEBUG
struct ListsView_Previews : PreviewProvider {
    static var previews: some View {
        ListsView()
            .environmentObject(LinkListStore())
    }
}
#endif

1 个答案:

答案 0 :(得分:1)

从Apple文档EnvironmentObject

  

EnvironmentObject   一个动态视图属性,它使用祖先视图提供的可绑定对象,只要可绑定对象发生更改,该属性就会使当前视图无效。

由于绑定影响当前视图层次结构而进行翻译。我的猜测是,当您通过PresentationButton呈现新视图时,您正在创建一个新的层次结构,该层次结构不植根于您的视图中-您已将对象提供给该层次结构。我猜这里的解决方法是通过实现确认EnvironmentKey协议的结构来将对象添加到“全局”环境中。