如何使用 flutter 实时数据库中的条件获取特定文档

How can I get specific documents using conditions from flutter real-time database

这是实时 Firebase 数据

在这张图片中,您可以看到数据,我只想显示数据库中的可用项目文档。但它显示了所有文件。 我只想显示可用数据。如果您知道如何做到一次或使用流或任何其他解决方案,请提供帮助,因为我被困了 3 天。

这是主页面的正文

 class OrderMenu extends StatefulWidget {
      const OrderMenu({
        Key? key,
        required this.dbChild,
      }) : super(key: key);
    
      final String dbChild;
    
      @override
      _OrderMenuState createState() => _OrderMenuState();
    }
    
    class _OrderMenuState extends State<OrderMenu> {
      DatabaseReference db = FirebaseDatabase.instance.reference();
      User? curUser = FirebaseAuth.instance.currentUser;
    
      int? len;
      List<GetData>? data;
      Map<String, dynamic>? proceed;
      List<GetData>? AvailData;
    
      late List<bool>? avail = List.generate(
        len!,
        (index) => false,
      );
    
      @override
      Widget build(BuildContext context) {
        return StreamBuilder<List<GetData>>(
          stream: DataStreamPublisher(widget.dbChild).getMenuStream(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              data = snapshot.data;
              len = data!.length;
              return SafeArea(
                child: SingleChildScrollView(
                  child: Container(
                    margin: EdgeInsets.symmetric(vertical: 10.0),
                    width: double.infinity,
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        SizedBox(
                          width: double.infinity,
                          child: DataTable2(
                            showBottomBorder: true,
                            headingRowHeight: 40,
                            showCheckboxColumn: true,
                            sortAscending: true,
                            columnSpacing: 5,
                            dataRowHeight: 60,
                            dividerThickness: 2,
                            bottomMargin: 20.0,
                            checkboxHorizontalMargin: 5,
                            columns: [
                              DataColumn2(
                                size: ColumnSize.L,
                                label: Center(
                                  child: Text(
                                    "Item Name",
                                    style: TextStyle(
                                      fontSize: 16,
                                      fontWeight: FontWeight.w600,
                                    ),
                                  ),
                                ),
                              ),
                              DataColumn2(
                                size: ColumnSize.S,
                                label: Center(
                                  child: Text(
                                    "Price",
                                    style: TextStyle(
                                      fontSize: 16,
                                      fontWeight: FontWeight.w600,
                                    ),
                                  ),
                                ),
                              ),
                              DataColumn2(
                                size: ColumnSize.L,
                                label: Center(
                                  child: Text(
                                    "Quantity",
                                    style: TextStyle(
                                      fontSize: 16,
                                      fontWeight: FontWeight.w600,
                                    ),
                                  ),
                                ),
                              ),
                            ],
                            rows: List<DataRow>.generate(
                              data!.length,
                              (index) => DataRow2(
                                selected: avail![index],
                                onSelectChanged: (bool? value) {
                                  setState(() {
                                    avail![index] = value!;
                                  });
                                },
                                color: MaterialStateProperty.resolveWith<Color?>(
                                  (Set<MaterialState> states) {
                                    if (states.contains(MaterialState.selected)) {
                                      return Theme.of(context)
                                          .colorScheme
                                          .primary
                                          .withOpacity(0.08);
                                    }
                                    return null;
                                  },
                                ),
                                cells: [
                                  DataCell(
                                    Text(
                                      data![index].Juice_Name,
                                    ),
                                  ),
                                  DataCell(
                                    Center(
                                      child: Text(
                                        data![index].Price,
                                      ),
                                    ),
                                  ),
                                  DataCell(
                                    IncDecButton(),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              );
            } else if (snapshot.hasError) {
              return Center(
                child: Text(
                  'Add Item in Menu.',
                  style: TextStyle(
                    fontSize: 18,
                  ),
                ),
              );
            }
            return Center(
              child: const CircularProgressIndicator(),
            );
          },
        );
      }
    }

**This is stream of GetDataPublisher**

   

     class DataStreamPublisher {
      final String dbChild;
      DatabaseReference database = FirebaseDatabase.instance.reference();
      User? curUser = FirebaseAuth.instance.currentUser;
    
      DataStreamPublisher(this.dbChild);
    
      Stream<List<GetData>> getDataStream() {
        final dataStream = database.child(curUser!.uid).child(dbChild).onValue;
        final streamToPublish = dataStream.map((event) {
          final dataMap = Map<String, dynamic>.from(event.snapshot.value);
          final dataList = dataMap.entries.map((e) {
            return GetData.fromRTDB(Map<String, dynamic>.from(e.value));
          }).toList();
          return dataList;
        });
        return streamToPublish;
      }
    
      Stream<List<GetData>> getMenuStream() {
        final dataStream = database.child(curUser!.uid).child(dbChild).onValue;
        final streamToPublish = dataStream.map((event) {
          final dataMap = Map<String, dynamic>.from(event.snapshot.value);
          final dataList = dataMap.entries.map((e) {
            **if (e.value["Available"] == true) {
              print("Here I need a condition to get available data. OR any other possibility");
            }**
            return GetData.fromRTDB(Map<String, dynamic>.from(e.value));
          }).toList();
          return dataList;
        });
        return streamToPublish;
      }
    }

这是GetDataclass

class GetData {
      String Juice_Name;
      String Price;
      bool Available;
      var key;
    
      GetData({
        required this.Juice_Name,
        required this.Available,
        required this.Price,
        required this.key,
      });
    
      factory GetData.fromRTDB(Map<String, dynamic> data) {
        return GetData(
          Juice_Name: data['Juice_Name'] ?? 'Enter Juice Name',
          Price: data['Price'] ?? 'Enter Price',
          Available: data['Available'] ?? false,
          key: data['Key'] ?? 'key',
        );
      }
    }

当您使用以下参考时:

final dataStream = database.child(curUser!.uid).child(dbChild)

您确实会得到“dbChild”节点下的所有数据。

如果您只需要获取“可用”属性 设置为 true 的对象,那么您应该使用如下所示的查询:

DatabaseReference db = FirebaseDatabase.instance.reference();
var query = db.child(curUser!.uid).child('Juices').orderByChild("Available").equalTo(true);