查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore

Posted

技术标签:

【中文标题】查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore【英文标题】:How to use Variables Cloud Firestore in Flutter (Dart) while doing query 【发布时间】:2022-01-23 12:17:37 【问题描述】:

这是我的工作代码:

final Stream<QuerySnapshot> products = FirebaseFirestore.instance
  .collection('products')
  .doc('men')
  .collection('tshirts')
  .snapshots();

这是我想要但不起作用的代码:

String val = 'tshirts';
final Stream<QuerySnapshot> products = FirebaseFirestore.instance
      .collection('products')
      .doc('men')
      .collection(val)
      .snapshots();

错误: 无法在初始化程序中访问实例成员“val”。 尝试用不同的表达式替换对实例成员的引用

我在构建小部件中使用的波纹管代码显示数据库查询结果和工作正常:

GridView.count(
          physics: const BouncingScrollPhysics(),
          crossAxisCount: 2,
          childAspectRatio: 0.5,
          mainAxisSpacing: 30,
          crossAxisSpacing: 10,
          children: snapshot.data!.docs.map((DocumentSnapshot document) 
            Map<String, dynamic> data =
                document.data()! as Map<String, dynamic>;

            return Visibility(
              child: GestureDetector(
                  onTap: () 
                    Navigator.push(
                        context,
                        PageTransition(
                          type: PageTransitionType.bottomToTop,
                          child: const ProductView(productId: '3453245'),
                        ));
                  ,
                  child: Stack(
                    children: [
                      Container(
                        decoration: BoxDecoration(
                            image: DecorationImage(
                                image: NetworkImage('$data['img']'),
                                fit: BoxFit.cover)),
                      ),
                      Align(
                        alignment: Alignment.bottomLeft,
                        child: SizedBox(
                          height: 70,
                          width: double.infinity,
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Container(
                                margin: const EdgeInsets.only(
                                    right: 18, top: 15, left: 5),
                                child: Text(
                                  data['name'].toUpperCase(),
                                  textAlign: TextAlign.left,
                                  style: GoogleFonts.oswald(
                                    color: Colors.black,
                                    fontSize: 15,
                                  ),
                                  overflow: TextOverflow.ellipsis,
                                  maxLines: 1,
                                  softWrap: false,
                                ),
                              ),
                              Container(
                                margin: const EdgeInsets.only(left: 5),
                                child: Text(
                                  '\u20B9 $data['price']',
                                  textAlign: TextAlign.left,
                                  style: const TextStyle(
                                    color: Colors.black,
                                    fontSize: 14,
                                  ),
                                  overflow: TextOverflow.ellipsis,
                                  maxLines: 1,
                                ),
                              )
                            ],
                          ),
                        ).frosted(
                          blur: 7,
                        ),
                      ),
                    ],
                  )),
              visible: true,
            );
          ).toList(),
        )

【问题讨论】:

【参考方案1】:

您甚至在初始化所使用的类之前就尝试使用val。 您只能在方法或构造函数中访问它,例如:

@override
void initState() 
    super.initState();
    final Stream<QuerySnapshot> products = FirebaseFirestore.instance.collection('products').doc('men').collection(val).snapshots();

【讨论】:

那如何在initState之外使用变量products?? @HimanshuBohemia String val = 'tshirts'; 这个你可以将它声明为一个实例变量,但你不能使用val 除非类被初始化。如果你想使用products 变量只是使用 Stream&lt;QuerySnapshot&gt;? 将其作为最初引用 null 的实例变量

以上是关于查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore的主要内容,如果未能解决你的问题,请参考以下文章

使用 dart:HTML 库在 Flutter Web 中选择文件时如何获取 Flutter 中的文件名?

(Flutter/Dart) 如何修复使用 [ ] 显示列表中的数字

在 Flutter 中使用 Dart,如何添加到地图列表中的地图列表中?

在 Flutter/Dart 中从字节加载图像的问题

集成测试时如何解决 Flutter 中请求“dart.ui”的问题

如何在Dart / flutter中映射和显示嵌套的JSON?