如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?

Posted

技术标签:

【中文标题】如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 \'List<DataRow>\',但得到类型为 \'List<dynamic>”的值之一?【英文标题】:How do I get rid of flutter data-table error using with StreamBuilder "Expected a value of type 'List<DataRow>', but got one of type 'List<dynamic>"?如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一? 【发布时间】:2021-10-30 12:54:36 【问题描述】:

在代码中,代码以实时(流)方式从 Cloud Firestore 获取数据,并使用 StreamBuilder 在数据表小部件中显示它,但是当我运行代码时,它给出了我上面所问的错误.

SizedBox(
     width: double.infinity,
     child: StreamBuilder(
           stream: FirebaseFirestore.instance.collection('products').snapshots(),
           builder: (BuildContext context,snapshot) 
           (!snapshot.hasData)? 
           Center(child: CircularProgressIndicator())
           : DataTable(
              // columnSpacing: defaultPadding,
              columns: [
                        DataColumn(label: Text("Id")),
                        DataColumn(label: Text("Name")),
                        DataColumn(label: Text("Category")),
                        DataColumn(label: Text("Image")),
                        DataColumn(label: Text("Original Price")),
                        DataColumn(label: Text("Sale Price")),
                        DataColumn(label: Text("Discount")),
                        DataColumn(label: Text("Commission")),
                        DataColumn(label: Text("Date")),
                       ],
              rows: _listofRows(snapshot.data),
        );
  )),

_listofRows 方法代码在这里

List<DataRow> _listofRows(snapshot) 
  List<DataRow> newList = snapshot.docs.map((docSnapshot) 
    return  DataRow(cells: <DataCell>[
     DataCell(Text(docSnapshot.data()['ProductID'].toString())),
     DataCell(Text(docSnapshot.data()['Product Name'].toString())),
     DataCell(Text(docSnapshot.data()['Category Name'].toString())),
     DataCell(Text(docSnapshot.data()['Product ImageUrl'].toString())),
     DataCell(Text(docSnapshot.data()['originalPrice'].toString())),
     DataCell(Text(docSnapshot.data()['salePrice'].toString())),
     DataCell(Text(docSnapshot.data()['Discount'].toString())),
     DataCell(Text(docSnapshot.data()['Commission Rate'].toString())),
     DataCell(Text(doctSnapshot.data()['Out of Stock Date'].toString())),
    ]);
  ).toList();

  return newList;


this is one of the document examples of products collection on firestore database. (link of product document)

【问题讨论】:

【参考方案1】:

解决方案是为 map 方法提供类型参数。

List<DataRow> _listofRows(snapshot) 
  List<DataRow> newList = snapshot.docs.map<DataRow>((docSnapshot) 
    return  DataRow(cells: <DataCell>[
     DataCell(Text(docSnapshot.data()['ProductID'].toString())),
     DataCell(Text(docSnapshot.data()['Product Name'].toString())),
     DataCell(Text(docSnapshot.data()['Category Name'].toString())),
     DataCell(Text(docSnapshot.data()['Product ImageUrl'].toString())),
     DataCell(Text(docSnapshot.data()['originalPrice'].toString())),
     DataCell(Text(docSnapshot.data()['salePrice'].toString())),
     DataCell(Text(docSnapshot.data()['Discount'].toString())),
     DataCell(Text(docSnapshot.data()['Commission Rate'].toString())),
     DataCell(Text(doctSnapshot.data()['Out of Stock Date'].toString())),
    ]);
  ).toList();

  return newList;

If you want to check more, there is a similar answer of type inference fails in an unexpected way.

[感谢@乔纳·威廉姆斯] :https://***.com/users/4231909/jonah-williams

【讨论】:

以上是关于如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FirebaseStorage 中使用 StreamBuilder 来通知我的应用我的 Firebase 存储发生变化?在颤振中

如何在 Flutter 中使用 Firestone 的 streambuilder 获取嵌套文档?

如何创建搜索栏和列表(使用 FireStore 中的 StreamBuilder 和 Listview 创建)一起滚动?

Flutter Firestore 和 StreamBuilder

将数据从 FireBase 检索到颤振项目时出错

Flutter Web:StreamBuilder 浏览器调整大小和重建