致命错误@EnvironmentObject 不工作

问题描述 投票:0回答:1

我有 2 个视图,但我无法让数据流与带有 @Environment 对象的 Picker 一起工作,我总是会因崩溃而出现致命错误,但我已经在预览和 ResultView 中声明了环境对象。

第一眼看起来像这样

import SwiftUI

@MainActor class DataExample : ObservableObject {
    @Published var testnumber = "Test"
    
}

struct PickerView: View {
    
   @StateObject var data = DataExample()
   
    
    var body: some View {
      
        VStack {
            Picker(
                selection: $data.testnumber,
                label: Text("PickerName"),
                content: {
                    
                    Text("John").tag("John")
                        .foregroundColor(.black)
                    Text("Freddy").tag("Freddy")
                        .foregroundColor(.black)
                    Text("Becky").tag("Becky")
                        .foregroundColor(.black)
                      
                })
           
            
            .frame(width: 120, height: 45)
            .pickerStyle(.wheel)
            
               
        }
        .environmentObject(data)
       
    }
}
    
struct PickerView_Previews: PreviewProvider {
    static var previews: some View {
        PickerView()
           
    }
}

第二视图看起来像这样

import SwiftUI

struct PickerResultView: View {
  
    @EnvironmentObject var data : DataExample
   
    var body: some View {
        
        HStack {
            
            PickerView()
            Text("\(data.testnumber)")
            .environmentObject(data)
            
                
            }
       
        }
       
}

struct PickerResultView_Previews: PreviewProvider {
    static var previews: some View {
        PickerResultView()
            .environmentObject(DataExample())
    }
}

也许有人可以指出我的问题。

object swiftui environment
1个回答
0
投票

上面是使用环境对象的示例。该对象必须位于将访问它的视图层次结构的顶部。例如,我将它放在 ContentView 级别,但它可能会更低,具体取决于应用程序。环境对象正在创建共享实例:

@main
struct yourApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(DataExample())
        }
    }
}

这是为访问上面的环境对象而修改的示例代码。 PickerView 和 PickerResultView 这两个视图可以独立使用:

struct ContentView: View {
    var body: some View {
        TabView {
            ResultsView()
                .tabItem {
                    Label("Result", systemImage: "folder")
                }
            
            SettingsView()
                .tabItem {
                    Label("Settings", systemImage: "gearshape")
                }
        }
    }
}

struct ResultsView: View {
    var body: some View {
        ZStack {
            Color.teal.ignoresSafeArea()
            PickerResultView()
        }
    }
}

struct SettingsView: View {
    var body: some View {
        ZStack {
            Color.orange.ignoresSafeArea()
            PickerView()
        }
    }
}


@MainActor class DataExample : ObservableObject {
    @Published var testnumber = "Test"
}


struct PickerView: View {
    
    @EnvironmentObject var data: DataExample

    var body: some View {
        
        VStack {
            Picker(
                selection: $data.testnumber,
                label: Text("PickerName"),
                content: {
                    
                    Text("John").tag("John")
                        .foregroundColor(.black)
                    Text("Freddy").tag("Freddy")
                        .foregroundColor(.black)
                    Text("Becky").tag("Becky")
                        .foregroundColor(.black)
                    
                })
            .frame(width: 120, height: 45)
            .pickerStyle(.wheel)
        }
    }
}


struct PickerResultView: View {
    
    @EnvironmentObject var data: DataExample
    
    var body: some View {
        HStack {
            Text("\(data.testnumber)")
        }
    }
}

结果看起来像这样,其中使用 pickerview(橙色)进行更改并且更改反映在应用程序的其他部分(青色):

© www.soinside.com 2019 - 2024. All rights reserved.