Представление пусто после вызова onAppear в Firebase Firestore после нажатия кнопки (из другого представления)IOS

Программируем под IOS
Ответить
Anonymous
 Представление пусто после вызова onAppear в Firebase Firestore после нажатия кнопки (из другого представления)

Сообщение Anonymous »

Я пытаюсь заполнить представление при нажатии кнопки в другом представлении. Когда я использовал свои фиктивные данные, все работало нормально. Однако, когда я переключаюсь на вызов данных моей базы данных Firestore, ничего не появляется. Я еще несколько месяцев изучаю SwiftUI, но таким же образом я вызывал db в другой части моего проекта, и это сработало хорошо. Вот пример кода, который я использую.

Код: Выделить всё

import SwiftUI
import FirebaseFirestore
import FirebaseFirestoreSwift

struct RewardsView: View {

// Dummy Data
//    var rewardItems: [Reward] = [
//        .init(RewardText: "10% Off Next Haircut", RewardRedeemed: false, rewardPhoto: "crown_kings_main_photo", costOfReward: 10),
//        .init(RewardText: "10% Off Extra Service", RewardRedeemed: true, rewardPhoto: "crown_kings_main_photo", costOfReward: 8),
//        .init(RewardText: "20% Next Haircut", RewardRedeemed: false, rewardPhoto: "crown_kings_main_photo", costOfReward: 15),
//        .init(RewardText: "30% off Next Haircut", RewardRedeemed: false, rewardPhoto: "crown_kings_main_photo", costOfReward: 20),
//        .init(RewardText: "25% Off Next Haircut", RewardRedeemed: true, rewardPhoto: "crown_kings_main_photo", costOfReward: 18),
//        .init(RewardText: "45% Off Next Haircut", RewardRedeemed: true, rewardPhoto: "crown_kings_main_photo", costOfReward: 30)
//    ]

@EnvironmentObject private var rewardsViewModel: RewardViewModel
@EnvironmentObject private var loyaltyViewModel: LoyaltyViewModel

@State var rewards: [Reward] = []

func getRewards() async throws -> [Reward]{
let db = Firestore.firestore()
let snapshot = try await db.collection("redeemRewards").getDocuments()
let rewards = snapshot.documents.compactMap{try? $0.data(as: Reward.self)}

return rewards
}

var body: some View {
NavigationStack{
ScrollView {
LazyVGrid (columns: [
GridItem(.flexible()),
GridItem(.flexible()),
], spacing: 16, content:{
ForEach(rewardsViewModel.rewards, id: \.self) { reward in
RewardsCardView(rewardPhoto:reward.rewardPhoto, rewardText: reward.rewardText, rewardRedeemed: reward.rewardRedeemed, costOfReward: reward.costOfReward)
.environmentObject(rewardsViewModel)
.environmentObject(loyaltyViewModel)

}
})
}
.onAppear {
Task{
do {
let newRewards = try await getRewards()
rewards.append(contentsOf: newRewards)
} catch {
print("Error Fetching rewards: \(error.localizedDescription)")
}
}
}
.navigationTitle("Rewards")
}
}
}

//#Preview {
//    RewardsView()
//}

struct Reward: Identifiable, Codable,Hashable {
@DocumentID var id: String?
let rewardText: String
let rewardRedeemed: Bool
let rewardPhoto: String
let costOfReward: CGFloat
let timestamp: Timestamp
let userId: String
let remainingPoints: CGFloat

func hash(into hasher: inout Hasher) {
hasher.combine(id)
}

static func == (lhs: Reward, rhs: Reward) -> Bool {
lhs.id == rhs.id
}
}
Возможно, я неправильно понимаю, как создается представление во время выполнения?
Спасибо за помощь и внимание.

Подробнее здесь: https://stackoverflow.com/questions/786 ... click-from
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»