如何修复 - 正文可能会正常完成导致返回 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
}
},
分析器提到的很正确,解释正在发生的事情是:
- 生成器功能需要一个小部件才能 return。
- 您只处理了一个条件。
根据您的代码,您只处理快照有数据的情况,但如果它没有任何数据,它 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
条件不满足,您将不会在屏幕上显示任何内容。
我正在使用流生成器从 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
}
},
分析器提到的很正确,解释正在发生的事情是:
- 生成器功能需要一个小部件才能 return。
- 您只处理了一个条件。
根据您的代码,您只处理快照有数据的情况,但如果它没有任何数据,它 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
条件不满足,您将不会在屏幕上显示任何内容。