Когда вы добавляете данные в Firestore, экран автоматически переключается - PullRequest
0 голосов
/ 06 мая 2020

Я разрабатываю приложение iOS с использованием Firestore и Swift.

Приложение - это приложение для регистрации ваших любимых фильмов.

Экран состоит из:

  • Список любимых фильмов
  • Список всех фильмов
  • Экран деталей видео

Вы можете использовать приведенный ниже код, чтобы добавить mov ie в ваши любимые.

Go в «MovieDetailView» из «MovieSearchView» и нажмите кнопку «Добавить».

Затем, по какой-то причине, он автоматически вернется в «Mov ie Search View».

Как я могу оставаться в MovieDetailView, даже если я нажму кнопку «Добавить»?

Спасибо.

import SwiftUI
import FirebaseFirestore
import Foundation

struct FavoriteMovieListView: View {
    @ObservedObject var favoriteMoviesFetcher = FavoriteMoviesFetcher()
    @State private var modalPresented: Bool = false

    var body: some View {
      VStack {
            Button(action: {
                self.modalPresented.toggle()
            }) {
                Text("Search")
            }
            .sheet(isPresented: self.$modalPresented) {
                MovieSearchView(onDismiss: {
                    self.modalPresented = false
                })
            }

            List(self.favoriteMoviesFetcher.data) { movie in
                Text(movie.title)
            }
        }
    }
}

struct MovieSearchView: View {
    @ObservedObject var allMovieFetcher = AllMovieFetcher()
    var onDismiss: () -> ()

    var body: some View {
        NavigationView {
            List(allMovieFetcher.data) { movie in
                NavigationLink(
                    destination: MovieDetailView(
                        movie: movie
                    )
                ) {
                    Text(movie.title)
                }
            }
        }
    }
}

struct MovieDetailView: View {
    @State var movie: MovieModel

    var body: some View {
        Button(action: {
            FavoriteMoviesService().addMovie(movie: self.movie)
        }) {
            Text("Add")
        }
    }
}

class FavoriteMovieFetcher: ObservableObject {
    @Published var data: [MovieModel] = []

    private var db: Firestore!
    private var uid: String

    init() {
        db = Firestore.firestore()
        uid = UserDefaults.standard.object(forKey: "userUid") as! String

        fetchData()
    }

    private func fetchData() {
        self.db.collection("favoriteMovies/\(uid)/movies").addSnapshotListener { querySnapshot, error in

            guard let snapshot = querySnapshot else {
                print("Error fetching snapshots: \(error!)")
                return
            }

            snapshot.documentChanges.forEach { diff in
                if (diff.type == .added) {
                    self.data.append(MovieModel(
                        movieId: diff.document.documentID,
                        title: diff.document.data()["title"]as! String
                    ))
                } else if (diff.type == .modified) {

                } else if (diff.type == .removed) {
                    self.data = self.data.filter { $0.movieId != diff.document.documentID }
                }
            }

            self.isLoading = false
        }
    }
}

class AllMovieFetcher: ObservableObject {
    @Published var data: [MovieModel] = []
    private var db: Firestore!

    init() {
        db = Firestore.firestore()
        fetchData()
    }

    private func fetchData() {
        self.db.collection("movies").getDocuments { (snaps, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            }

            guard let snaps = snaps else { return }

            for document in snaps.documents {
                    self.data.append(
                        MovieModel(
                            movieId: document.documentID,
                            title: document.data()["title"]as! String
                        )
                    )
            }
        }
    }
}

class FavoriteMoviesService: ObservableObject {
    private var db: Firestore!
    private var uid: String

    init() {
        db = Firestore.firestore()
        uid = UserDefaults.standard.object(forKey: "userUid") as! String
    }

    func addMovie(movie: MovieModel) {
        self.db.collection("favoriteMovies/\(uid)/movies").document(movie.movieId).setData([
            "title": movie.title
        ]) { err in
            if let err = err {
                print("Error adding document: \(err)")
            } else {

            }
        }
    }
}

struct MovieModel: Identifiable {
    var id = UUID()
    var movieId: String
    var title: String
}
...