如何使用变量初始化新的 Firebase @FirestoreQuery 属性包装器?

Posted

技术标签:

【中文标题】如何使用变量初始化新的 Firebase @FirestoreQuery 属性包装器?【英文标题】:How to initialize the new Firebase @FirestoreQuery property wrapper with variables? 【发布时间】:2021-11-15 02:38:58 【问题描述】:

我使用新的 @FirestoreQuery 属性包装器,它与下面的代码一起使用。但我需要使用它/用变量初始化它,我该怎么做(见下文我要做什么)?

import SwiftUI
import FirebaseFirestoreSwift

struct TestFirestoreQuery: View 
    @State var itemLimit: Int = 5
    let increment: Int = 5
    
    @FirestoreQuery(collectionPath: "/discussions/blablabal/messages",
                    predicates: [
                        .order(by: "dateCreated", descending: true),
                        .limit(to: 5)
                    ]
    ) fileprivate var MessageResults: Result<[Message_M], Error>
    
    var body: some View 
        VStack 
            if case let .success(Messages) = MessageResults 
                List(Messages.reversed())  message in
                    Text("\(message.msg)")
                
                .refreshable
                    itemLimit += increment
                    $MessageResults.predicates = [
                        .order(by: "dateCreated", descending: true),
                        .limit(to: itemLimit)
                    ]
                
            
            else if case let .failure(error) = MessageResults 
                // Handle error
                Text("Couldn't map data: \(error.localizedDescription)")
            
            Button 
                itemLimit += increment
                $MessageResults.predicates = [
                    .order(by: "dateCreated", descending: true),
                    .limit(to: itemLimit)
                ]
             label: 
                Text("Tap me!")
                    .padding()
                    .foregroundColor(.white)
                    .background(.red)
            
        
    

我想做什么,但它不起作用:

...
    @State var itemLimit: Int = 5
    let increment: Int = 5
    let path: String = "/discussions/blablabal/messages"
    
    @FirestoreQuery(collectionPath: path,
                    predicates: [
                        .order(by: "dateCreated", descending: true),
                        .limit(to: itemLimit)
                    ]
    ) fileprivate var MessageResults: Result<[Message_M], Error>

...

我收到了这些错误:

不能在属性初始化器中使用实例成员“路径”;属性初始化程序在 'self' 可用之前运行...

不能在属性初始化器中使用实例成员“itemLimit”;属性初始化器在“self”可用之前运行

【问题讨论】:

您似乎遇到了*** thread 中提到的类似问题。可以试试accepted answer中提到的答案吗? 【参考方案1】:

好的,你可以在 onAppear 中初始化它们:

.onAppear 
           $MessageResults.path = path

           $MessageResults.predicates = [
                          .order(by: "dateCreated", descending: true),
                          .limit(to: itemLimit)
                          ]


【讨论】:

【参考方案2】:

在创建 @FirestoreQuery 时,路径变量还不可用。

为什么需要将路径作为单独的变量?直接把String传入@FirestoreQuery会不会更方便?

@FirestoreQuery(collectionPath: "/discussions/blablabal/messages",
                predicates: [
                    .order(by: "dateCreated", descending: true),
                    .limit(to: itemLimit)
                ]

这样您就不必添加 onAppear 修饰符。

【讨论】:

以上是关于如何使用变量初始化新的 Firebase @FirestoreQuery 属性包装器?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.3 pod 更新后使用未解析的标识符 Firebase 'FIR'

如何迁移到 react-redux-firebase v3

是否可以通过 API 创建一个新的 Firebase 项目?

为什么新的Firebase Crashlytics(没有Fabric)在Android中不起作用?

尝试将 Firebase 添加到 iOS 应用,但无法添加初始化代码

firebase_messaging :没有通知通过