抛出以下断言构建流构建器<QuerySnapshot>(脏,状态:_StreamBuilderBaseState<查询快照,异步快照



我在多供应商应用程序中遇到此错误。当我在应用程序中添加新产品时。它进入未发布部分,然后你必须从那里发布它。当我添加一个产品时,没有问题(我想是因为它没有发生在一个产品上。(但当我添加第二个产品并转到未发布的页面时,我会收到这个错误。''

The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
_StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#c1af9):
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 378 pos 10: 'data != null'
The relevant error-causing widget was:
StreamBuilder<QuerySnapshot>

file:///I:/AAAAAAYy/Vendor1/grocery_vendor_app/lib/widgets/unpublished_products.dart:11:14
When the exception was thrown, this was the stack:
#2      new Text (package:flutter/src/widgets/text.dart:378:10)
#3      UnPublishedProducts._productDetails.<anonymous closure>
(package:grocery_vendor_app/widgets/unpublished_products.dart:66:30)
#4      MappedListIterable.elementAt (dart:_internal/iterable.dart:411:31)
#5      ListIterator.moveNext (dart:_internal/iterable.dart:340:26)
#6      new _GrowableList._ofEfficientLengthIterable (dart:core- 
patch/growable_array.dart:188:27)
#7      new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#8      new List.of (dart:core-patch/array_patch.dart:50:28)
#9      ListIterable.toList (dart:_internal/iterable.dart:211:44)
#10     UnPublishedProducts._productDetails 
(package:grocery_vendor_app/widgets/unpublished_products.dart:110:8)                    #11     
UnPublishedProducts.build.<anonymous closure>
(package:grocery_vendor_app/widgets/unpublished_products.dart:43:23)
#12     StreamBuilder.build (package:flutter/src/widgets/async.dart:545:81)
#13     _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:124:48)
#14     StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#15     ComponentElement.performRebuild 
(package:flutter/src/widgets/framework.dart:4495:15)
#16     StatefulElement.performRebuild 
(package:flutter/src/widgets/framework.dart:4667:11)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:4189:5)
#18     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2694:33)
#19     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:873:21)
#20     RendererBinding._handlePersistentFrameCallback 
(package:flutter/src/rendering/binding.dart:319:5)
#21     SchedulerBinding._invokeFrameCallback 
(package:flutter/src/scheduler/binding.dart:1144:15)
#22     SchedulerBinding.handleDrawFrame 
(package:flutter/src/scheduler/binding.dart:1082:9)
#23     SchedulerBinding._handleDrawFrame 
(package:flutter/src/scheduler/binding.dart:998:5)
#27     _invoke (dart:ui/hooks.dart:161:10)
#28     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:253:5)
#29     _drawFrame (dart:ui/hooks.dart:120:31)
(elided 5 frames from class _AssertionError and dart:async)

''

Here is  my code

''

class UnPublishedProducts extends StatelessWidget {
@override
Widget build(BuildContext context) {
FirebaseServices _services = FirebaseServices();
return Container(
child: StreamBuilder(
stream:
_services.products.where('published', isEqualTo: 
false).snapshots(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Something went wrong..');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
return SingleChildScrollView(
child: FittedBox(
child: DataTable(
showBottomBorder: true,
dataRowHeight: 60,
headingRowColor: MaterialStateProperty.all(Colors.grey[200]),
columns: <DataColumn>[
DataColumn(
label: Expanded(child: Text('Jobs')),
),
DataColumn(
label: Text('Image'),
),
DataColumn(
label: Text('Info'),
),
DataColumn(
label: Text('Actions'),
),
],
rows: _productDetails(snapshot.data, context),
),
),
);
},
),
);
}
List<DataRow> _productDetails(QuerySnapshot snapshot, context) {
List<DataRow> newList = snapshot.docs.map((DocumentSnapshot document) {
if (document != null) {
return DataRow(cells: [
DataCell(Container(
child: ListTile(
contentPadding: EdgeInsets.zero,
title: Row(
children: [
Text(
'Name: ',
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 
15),
),
Expanded(
child: Text(document.data()['productName'],
style: TextStyle(fontSize: 15))),
],
),
subtitle: Row(
children: [
Text(
'SKU: ',
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 
12),
),
Text(document.data()['sku'], style: TextStyle(fontSize: 
12)),
],
),
),
)),
DataCell(Container(
child: Padding(
padding: const EdgeInsets.all(3.0),
child: Row(
children: [
Image.network(
document.data()['productImage'],
width: 50,
),
],
),
),
)),
DataCell(IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EditViewProduct(
productId: document.data()['productId'],
),
),
);
},
icon: Icon(Icons.info_outline),
)),
DataCell(popUpButton(document.data())),
]);
}
}).toList();
return newList;
}

Widget popUpButton(data, {BuildContext context}) {
FirebaseServices _services = FirebaseServices();

return PopupMenuButton<String>(
onSelected: (String value) {
if (value == 'publish') {
_services.publishProduct(
id: data['productId'],
);
}

if (value == 'delete') {
_services.deleteProduct(id: data['productId']);
}
},
itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
const PopupMenuItem<String>(
value: 'publish',
child: ListTile(
leading: Icon(Icons.check),
title: Text('Publish'),
),
),
const PopupMenuItem<String>(
value: 'delete',
child: ListTile(
leading: Icon(Icons.delete_outline),
title: Text('Delete job'),
),
),
]);
}
}

''

document?.data()['productName'] ?? "-"

在所有密钥中使用零安全

document?.data()['your_key'] ?? "default data"

阅读更多关于零安全这里

最新更新