我正在做一个数据表,用按钮过滤。我看了一个教程。
我必须创建一个对象(名为:Kasalar_object
)。我在专栏中调用了StreamBuilder
小部件。我创建了我的DataSourceTable
。
在那之后,我用DataSourceTable
替换了我的源代码,但我必须把我的值放到我的对象上。我试着把它放进去,但我的应用程序显示:
应为“Map<String,dynamic”类型的值,但得到了“()=> Map<String,dynamic>”类型的值
在流没有错误.因为当我试图使用它没有对象.它的工作原理.这里是我的代码:
我的目标:
class Kasalar_object {
final String kasa_adi;
final String doviz_cinsi;
final String acilis_bakiyesi;
final String olusturulma_tarihi;
final String aktivite;
Kasalar_object( {required this.kasa_adi , required this.doviz_cinsi, required this.acilis_bakiyesi, required this.olusturulma_tarihi, required this.aktivite});
// Map<String, dynamic>
factory Kasalar_object.fromMap( Map<String, dynamic> kasalar_objectim ) {
return Kasalar_object(
kasa_adi: kasalar_objectim['kasa_adi'],
doviz_cinsi: kasalar_objectim['doviz_cinsi'],
acilis_bakiyesi: kasalar_objectim['acilis_bakiyesi'],
olusturulma_tarihi: kasalar_objectim['olusturulma_tarihi'],
aktivite: kasalar_objectim['aktivite'], ); // );
}
StreamBuilder(
stream: firestore.collection("Users").doc(FirebaseAuth.instance.currentUser?.email).collection("kasalar").snapshots(),
builder: (context, AsyncSnapshot<QuerySnapshot> snap) {
List<Kasalar_object> kasalarim = [];
kasalarim = snap.data!.docs.map((e) => Kasalar_object.fromMap(e.data() as Map<String, dynamic> )).toList();
final DataTableSource _all_kasa = MyKasaData(kasalarim);
List<dynamic> map = snap.data!.docs;
if(snap.hasData ){
return PaginatedDataTable(
columns: [
DataColumn(label: Text('Kasa Adi'),),
DataColumn(label: Text('Para Birimi')),
DataColumn(label: Text('Açılıs Bakiyesi')),
DataColumn(label: Text('Oluşturulma Tarihi')),
DataColumn(label: Text('Aktif/Pasif')),
DataColumn(label: Text('İslemler')),
],
source: _all_kasa,
columnSpacing: witdh/15,
);
}
else{
return Center(child: CircularProgressIndicator()); // new Text('No data...');
}
}),
字符串
我的dataSourceTable:
class MyKasaData extends DataTableSource {
SideBarController sideBarController = Get.put(SideBarController());
// List<Kasalar> kasalar = [];
MyKasaData(this._data);
final List<dynamic> _data;
DataRow getRow(int index) {
return DataRow(cells: [
DataCell(Text(_data[index].data()['kasa_adi'])),
DataCell(Text(_data[index].data()['doviz_cinsi'])),
DataCell(Text(_data[index].data()['acilis_bakiyesi'])),
DataCell(Text(_data[index].data()['olusturulma_tarihi'])),
DataCell(Text(_data[index].data()['aktivite'])), }
型
下面是错误消息的图片:
enter image description here
如果我将data改为data(),结果如下:
enter image description here的
我该怎么补救?
1条答案
按热度按时间n8ghc7c11#
您的原始代码有以下行(为了更好的可读性而格式化):
字符串
这里,
snap
是AsyncSnapshot<QuerySnapshot>
,因此snap.data!
是QuerySnapshot
。每个
QuerySnapshot
都有一个docs
property,它返回一个List<QueryDocumentSnapshot>
。每个
QueryDocumentSnapshot
都有一个data
method,它返回一个Map<String, dynamic>
。在Dart中,property 和 method 的区别在于前者可以在其符号后不带括号地调用,而方法必须使用括号。因此,将
e.data
更改为e.data()
将有效地调用该方法并解决错误“Expected a value of type 'Map<String,dynamic String',but got one of type '()=> Map<String,dynamic String'”。更新后的代码有以下代码(也是为了更好的可读性而格式化的):
型
在这里,你创建了一个示例,将
kasalarim
传递给它的构造函数:型
请注意,
kasalarim
是Kasalar_object
的列表,它们只有属性kasa_adi
、doviz_cinsi
、acilis_bakiyesi
、olusturulma_tarihi
和aktivite
。将
kasalarim
传递给MyKasaData
将使其_data
字段包含Kasalar_object
的列表。型
我会尝试在
Kasalar_object
上调用一个名为data()
的方法,这个方法不存在!Kasalar_object
有一个kasa_adi
属性,你可以直接访问它:型
最后,使用
dynamic
是不好的,所以将_data
设置为List<Kasalar_object>
,这样可以帮助您提前检测到这个错误。