SwiftUI @EnvironmentObject нет ObservableObject типа ошибка - PullRequest
0 голосов
/ 05 августа 2020

Я получаю сообщение об ошибке

Неустранимая ошибка: не обнаружен ObservableObject типа LoginResponse. Объект View.environmentObject (_ :) для LoginResponse может отсутствовать в качестве предка этого представления. 1007 *

struct LoginView: View {
    
    @State var loginCredentials = Credentials()
    var loginResponse = LoginResponse()
    var dataCall = DataCall()
    
    var body: some View {
        VStack{
            
            Button(action:{self.dataCall.AttemptLogin(loginCredentials: self.loginCredentials)}){
                
                Text("LOGIN")
                
            }
            
            Text("\(self.loginResponse.jwt)")
            
        }
        .environmentObject(self.loginResponse)
        .padding(.horizontal)
    }
}

Вот остальной код, если нужно

struct Credentials: Encodable {
    var login: String = ""
    var password: String = ""
}

class LoginResponse: Decodable, ObservableObject {
    
    enum CodingKeys: CodingKey {
        case success, userId, jwt
    }
    
    @Published var success: Bool = false
    @Published var userId: String = ""
    var error: String = ""
    @Published var jwt: String = ""
    init(){}
    required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        success = try values.decode(Bool.self, forKey: .success)
        userId = try values.decode(String.self, forKey: .userId)
        jwt = try values.decode(String.self, forKey: .jwt)
    }
}

struct DataCall {
    
    @EnvironmentObject var dataResponse : LoginResponse
    
    func AttemptLogin(loginCredentials: Credentials)  {
        
        let loginResponse = LoginResponse()
        dataResponse.success = loginResponse.success
        
        }
}

1 Ответ

0 голосов
/ 05 августа 2020

Поскольку DataCall не является представлением SwiftUI, я не верю, что вы можете использовать модификатор .environmentObject для передачи в него данных. Вместо этого просто добавьте ссылку на объект LoginResponse в структуру DataCall и передайте ее через конструктор, как обычно.

Пример:

struct DataCall {
  weak var dataResponse : LoginResponse
  ...
}

let dataCall = DataCall(dataResponse: loginResponse)

Однако я довольно запутался в дизайне вашего представления. Любой объект, который вы обычно объявляете в View, без @State или @ObservedObject, будет воссоздаваться снова и снова. Вы этого хотите?

...