SwiftUI Открыть представление двумя различными способами, используя шаблон модели представления - PullRequest
1 голос
/ 17 марта 2020

Мне нужно открыть представление с именем RequestDetails.

В двух случаях это представление можно открыть.

  1. Предоставление данных для открытия этого запроса

  2. Предоставление ссылки на документ Firestore

В этом случае у меня нет всех деталей этой спецификации c Запрос, но у меня есть просто ссылка на документ Firestore. Я использую эту ссылку, чтобы сделать запрос, как только появится это представление, и получить сведения об этом запросе RequestDetail(reference: reference)

class RequestViewModel: ObservableObject {
    @Published var request: RequestModel?
    @Published var requestReference: DocumentReference?

    init(request: RequestModel? = nil, requestReference: DocumentReference? = nil) {
        self.request = request
        self.requestReference = requestReference
    }

    func loadRequest() {
        FirestoreService().fetchDocument(documentReference: self.requestReference) { (request: RequestModel) in
            DispatchQueue.main.async {
                self.request = request
            }
        }
    }

}

struct RequestDetails: View {
    @State var reference: DocumentReference?
    @State var request: RequestModel?

    @ObservedObject var vm: RequestViewModel

    var body: some View {
        VStack {
            if request != nil {
                Text(self.request?.senderFirstName)
            }
        }.onAppear {
            if self.vm.package == nil {
                self.vm.loadRequest()
            }
        }
    }
}

struct Home: View {
    var request: RequestModel
    var reference: DocumentReference

    var body: some View {
        VStack {
            RequestDetail(request: request)
            RequestDetail(reference: reference)
        }
    }
}

Дело в том, что я получаю много ошибок, и я интересно, в порядке ли лог c позади или нет. Правильно ли я использую шаблон модели представления?

1 Ответ

1 голос
/ 17 марта 2020

Следующее было бы целесообразно следовать концепции MVVM

struct RequestDetails: View {
    @ObservedObject var vm: RequestViewModel

    var body: some View {
        VStack {
            if self.vm.request != nil {
                Text(self.vm.request!.senderFirstName)
            }
        }.onAppear {
            if self.vm.request == nil {
                self.vm.loadRequest()
            }
        }
    }
}

struct Home: View {
    var request: RequestModel
    var reference: DocumentReference

    var body: some View {
        VStack {
            RequestDetail(vm: RequestViewModel(request: request))
            RequestDetail(vm: RequestViewModel(reference: reference))
        }
    }
}
...