flutter 应为“Map< String,dynamic”类型的值,但得到了“()=> Map< String,dynamic>”类型的值

ryhaxcpt  于 2023-11-21  发布在  Flutter
关注(0)|答案(1)|浏览(106)

我正在做一个数据表,用按钮过滤。我看了一个教程。
我必须创建一个对象(名为: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
我该怎么补救?

n8ghc7c1

n8ghc7c11#

您的原始代码有以下行(为了更好的可读性而格式化):

kasalarim = snap.data!
    .docs
    .map((e) => Kasalar_object.fromMap(e.data as Map<String, dynamic>))
    .toList();

字符串
这里,snapAsyncSnapshot<QuerySnapshot>,因此snap.data!QuerySnapshot
每个QuerySnapshot都有一个docsproperty,它返回一个List<QueryDocumentSnapshot>
每个QueryDocumentSnapshot都有一个datamethod,它返回一个Map<String, dynamic>
在Dart中,propertymethod 的区别在于前者可以在其符号后不带括号地调用,而方法必须使用括号。因此,将e.data更改为e.data()将有效地调用该方法并解决错误“Expected a value of type 'Map<String,dynamic String',but got one of type '()=> Map<String,dynamic String'”。
更新后的代码有以下代码(也是为了更好的可读性而格式化的):

class MyKasaData extends DataTableSource {
  SideBarController sideBarController = Get.put(SideBarController());

  final List<dynamic> _data;

  MyKasaData(this._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']))
    ]);
  }
}


在这里,你创建了一个示例,将kasalarim传递给它的构造函数:

List<Kasalar_object> kasalarim = snap.data!
    .docs
    .map((e) => Kasalar_object.fromMap(e.data() as Map<String, dynamic> ))
    .toList();

final DataTableSource _all_kasa = MyKasaData(kasalarim);


请注意,kasalarimKasalar_object的列表,它们只有属性kasa_adidoviz_cinsiacilis_bakiyesiolusturulma_tarihiaktivite
kasalarim传递给MyKasaData将使其_data字段包含Kasalar_object的列表。

_data[index].data()['kasa_adi']


我会尝试在Kasalar_object上调用一个名为data()的方法,这个方法不存在!Kasalar_object有一个kasa_adi属性,你可以直接访问它:

class MyKasaData extends DataTableSource {
  SideBarController sideBarController = Get.put(SideBarController());

  final List<dynamic> _data;

  MyKasaData(this._data);

  DataRow getRow(int index) {
    return DataRow(cells: [
      DataCell(Text(_data[index].kasa_adi)),
      DataCell(Text(_data[index].doviz_cinsi)),
      DataCell(Text(_data[index].acilis_bakiyesi)),
      DataCell(Text(_data[index].olusturulma_tarihi)),
      DataCell(Text(_data[index].aktivite))
    ]);
  }
}


最后,使用dynamic是不好的,所以将_data设置为List<Kasalar_object>,这样可以帮助您提前检测到这个错误。

相关问题