如何修复 - 正文可能会正常完成导致返回 null --FLUTTER

How to fix - The body might complete normally causing null to be returned --FLUTTER

我正在使用流生成器从 Firebase 获取一些数据,但它给我一个错误

"The body might complete normally causing 'null' to be returned"

尽管我提供了一个 return 声明,我正在 returning 'data table' 小部件 这是我的代码

StreamBuilder<QuerySnapshot?>(
              stream: _firestore.collection('cashOut').snapshots(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  List<DataCell> displayedDataCell = [];

                  for (var item in snapshot.data!.docs) {
                    displayedDataCell.add(
                      DataCell(
                        Text(
                          item['amount'].toString(),
                        ),
                      ),
                    );
                  }
                  return DataTable(
                    columns: const <DataColumn>[
                      DataColumn(
                        label: Text(
                          'Date',
                        ),
                      ),
                      DataColumn(
                        label: Text(
                          'Amount',
                        ),
                      ),
                      DataColumn(
                        label: Text(
                          'Optional Detail',
                        ),
                      ),
                    ],
                    rows: <DataRow>[
                      DataRow(cells: displayedDataCell),
                    ],
                  );
                }
              },
            ),

DataTable 仅在您有数据时返回。您还需要处理其他状态,例如加载、错误...

builder: (context, snapshot) {
  if (snapshot.connectionState == ConnectionState.waiting) {
 /// return your widget while loadling
 } else if (snapshot.hasError) { 
 /// return your widget based on error
  } else if (snapshot.hasData) {
 /// return your widget while have data
  } else if (!snapshot.hasData) {
 /// return your widget while there is no data
  } else {
 /// return  widget
  }
},

分析器提到的很正确,解释正在发生的事情是:

  1. 生成器功能需要一个小部件才能 return。
  2. 您只处理了一个条件。

根据您的代码,您只处理快照有数据的情况,但如果它没有任何数据,它 returns null 构建器函数不接受。

您的问题的潜在解决方案可能是这样。

StreamBuilder<QuerySnapshot?>(
              stream: _firestore.collection('cashOut').snapshots(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  List<DataCell> displayedDataCell = [];

                  for (var item in snapshot.data!.docs) {
                    displayedDataCell.add(
                      DataCell(
                        Text(
                          item['amount'].toString(),
                        ),
                      ),
                    );
                  }
                  return DataTable(
                    columns: const <DataColumn>[
                      DataColumn(
                        label: Text(
                          'Date',
                        ),
                      ),
                      DataColumn(
                        label: Text(
                          'Amount',
                        ),
                      ),
                      DataColumn(
                        label: Text(
                          'Optional Detail',
                        ),
                      ),
                    ],
                    rows: <DataRow>[
                      DataRow(cells: displayedDataCell),
                    ],
                  );
                }
                // While it is loading or has no data
                return CircularProgressIndicator();
              },
           );

构建器功能需要一个小部件才能 return。在您的情况下,您正在 return 安装小部件,但它处于 if 状态。这意味着如果您的 if 条件不满足,您的构建器将 return null 这是不可接受的。

现在,根据其他答案,您可以处理其他状态和 return 事情。但是如果你不想处理其他状态并且你也不想显示加载器,在你的 if 块的末尾,只需添加 return Container();return SizedBox();

这样,如果 if 条件不满足,您将不会在屏幕上显示任何内容。