创建环境对象

creating an Environment object

有人可以帮我解决这个问题吗?每当我尝试将 gp 声明为环境对象时,该列表就会消失。当 gp 是 @State 变量时,该列表工作正常。你能帮我创建一个全局变量 gp 以便它在 Final 的另一个屏幕上工作吗?我想在最终屏幕中调用 gp,以便我可以使用 gp 的值来计算其他内容。

import SwiftUI
    
    
    struct Calculation: View {
        
        @State var load1 = Float()
        @State var load2 = Float()
        //@State var gp : Float = 0
        @State var rate: Float = 0
        @ObservedObject var taskStore = TaskStore()
        @EnvironmentObject var userSettings: UserSettings
        func addNewToDo() {
            taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: =  \(rate.description)", amount: rate))
        }
        
        var body: some View {
            NavigationView {
                VStack {
                    List {
                        
                        Section(header:Text("load 2"))
                        {
                            TextField("Enter value of load 1", value: $load1, format: .number)
                            TextField("Enter value of load 1", value: $load2, format: .number)
                        }
                        
                        HStack {
                            Button(String(format: "Add Load"), action: {
                                print("pay for the shift is ")
                                print(Rocky(mypay: rate))
                                userSettings.gp += rate
                            })
                            
                            Button(action: {
                                addNewToDo()
                                Rocky(mypay: rate)
                            },
                            label: {
                                Text(" ")
                            })
                        }
                        
                        ForEach(self.taskStore.tasks) { task in
                            Text(task.toDoItem)
                        }
                        .onMove(perform : self.move)
                        .onDelete(perform : self.delete) //For each
                        
                    }
                    .navigationBarTitle("SHIFTS")
                    .navigationBarItems(trailing: EditButton()) //List
                    
                    Text("Gross Pay = $\(userSettings.gp) ")
                     NavigationLink(destination: Final(), label: {Text("Next")})
                }.onAppear()
                
            }
        }
        
        func Rocky(mypay: Float)
        {
            rate = load1 + load2
            print("Sus \(userSettings.gp)")
        }
        func move(from source : IndexSet, to destination : Int)
        {
            taskStore.tasks.move(fromOffsets: source, toOffset: destination)
        }
        func delete(at offsets : IndexSet) {
            if let index = offsets.first {  //<-- Here
                let task = taskStore.tasks[index]
                userSettings.gp -= task.amount
            }
            taskStore.tasks.remove(atOffsets: offsets)
        }
    }
    
    struct Final: View {
        @EnvironmentObject var userSettings: UserSettings
        var body: some View {
            Text("Final result \(userSettings.gp)")
        }
    }

文件的另一部分如下:

import Foundation
import SwiftUI
import Combine
class UserSettings: ObservableObject
{
@Published var gp : Float = 0
    
}

struct Task : Identifiable {
    var id = String()
    var toDoItem = String()
    var amount : Float = 0 //<-- Here
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}

要使用您的 UserSettings ObservableObject,您需要在调用 Calculation 视图之前声明它。 使用 .environmentObject(userSettings) 将其传递给 Calculation,以便它在 Calculation 中可用 和所有“子视图”(如 Final),例如在这个示例代码中:

struct ContentView: View {
    @StateObject var userSettings = UserSettings()   // <-- here
    
    var body: some View {
        Calculation().environmentObject(userSettings)  // <-- here
    }
}

EDIT-1:这是我使用的完整测试代码:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


struct ContentView: View {
    @StateObject var userSettings = UserSettings()   // <-- here
    
    var body: some View {
        Calculation().environmentObject(userSettings)  // <-- here
    }
}

struct Calculation: View {
    
    @State var load1 = Float()
    @State var load2 = Float()
    @State var rate: Float = 0
    @StateObject var taskStore = TaskStore()  // <-- here
    
    @EnvironmentObject var userSettings: UserSettings
    
    func addNewToDo() {
        taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: =  \(rate.description)", amount: rate))
    }
    
    var body: some View {
        NavigationView {
            VStack {
                List {
                    Section(header:Text("load 2")){
                        TextField("Enter value of load 1", value: $load1, format: .number)
                        TextField("Enter value of load 1", value: $load2, format: .number)
                    }
                    
                    HStack {
                        Button(String(format: "Add Load"), action: {
                            print("pay for the shift is ")
                            print(Rocky(mypay: rate))
                            userSettings.gp += rate
                        })
                        
                        Button(action: {
                            addNewToDo()
                            Rocky(mypay: rate)
                        },
                               label: {
                            Text(" ")
                        })
                    }
                    
                    ForEach(self.taskStore.tasks) { task in
                        Text(task.toDoItem)
                    }
                    .onMove(perform : self.move)
                    .onDelete(perform : self.delete) //For each
                    
                }
                .navigationBarTitle("SHIFTS")
                .navigationBarItems(trailing: EditButton()) //List
                
                Text("Gross Pay = $\(userSettings.gp) ")
                NavigationLink(destination: Final(), label: {Text("Next")})
            }.onAppear()
            
        }
    }
    
    func Rocky(mypay: Float){
        rate = load1 + load2
        print("Sus \(userSettings.gp)")
    }
    
    func move(from source : IndexSet, to destination : Int){
        taskStore.tasks.move(fromOffsets: source, toOffset: destination)
    }
    
    func delete(at offsets : IndexSet) {
        if let index = offsets.first {  //<-- Here
            let task = taskStore.tasks[index]
            userSettings.gp -= task.amount
        }
        taskStore.tasks.remove(atOffsets: offsets)
    }
}

struct Final: View {
    @EnvironmentObject var userSettings: UserSettings
    var body: some View {
        Text("Final result \(userSettings.gp)")
    }
}


class UserSettings: ObservableObject {
    @Published var gp : Float = 0
}

struct Task : Identifiable {
    var id = String()
    var toDoItem = String()
    var amount : Float = 0 //<-- Here
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}