我正在制作一个数据表,用于使用按钮进行筛选.我看了一个教程.

我必须创建一个对象(名为:Kasalar_object).在我的专栏中,我已经将StreamBuilder小部件命名为.我创造了我的DataSourceTable.

在那之后,我用我的DataSourceTable替换了我的来源,但我必须把我的价值观放在我的对象上.我试着把它放进go ,但我的应用程序显示:

应为‘Map<字符串,动态>’类型的值,但获得的类型为‘()=>映射<字符串,动态>’

流媒体没有错误.因为当我试图在没有对象的情况下使用它时.它起作用了.以下是我的代码:

我的目标是:

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(),则结果如下:

enter image description here

我怎么才能修好它呢?

推荐答案

您的原始代码包含以下行(为提高可读性而设置了格式):

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

在这里,snapAsyncSnapshot<QuerySnapshot>,因此snap.data!QuerySnapshot.

每个QuerySnapshot都有一个docs property,它返回一个List<QueryDocumentSnapshot>.

每个QueryDocumentSnapshot都有一个data method,它返回一个Map<String, dynamic>.

在DART中,propertymethod之间的区别在于,前者可以在其符号后不加括号地调用,而方法则必须使用括号.因此,将e.data更改为e.data()将有效地调用该方法并解决错误"预期的值类型为‘Map<;字符串,动态>;’,但得到的值类型为‘()=>;Map<;字符串,动态>;’".


然后,您更新的代码具有以下代码(为了更好的可读性,也进行了格式化):

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);

注意,kasalarim是只具有属性kasa_adidoviz_cinsiacilis_bakiyesiolusturulma_tarihiaktiviteKasalar_object的列表.

kasalarim传递给MyKasaData将使其_data字段包含Kasalar_object的列表.所以,打电话给

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

我会try 在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))
    ]);
  }
}

最后是using dynamic is bad,所以_data等于List<Kasalar_object>,这可以帮助您预先检测到这个错误.

Flutter相关问答推荐

为什么小部件会在其父文件中重建,但放在单独文件中时却不会重建?

SingleChildScrollView正在将Container的高度限制为子对象,尽管使用了Expanded Inside Row()

如何组合匹配器

Flutter 图标记移动

运行调试flutter应用程序时出错:B/BL超出范围(最大+/-128MB)到'';

Flutter 需要 Xcode 14 或更高版本

Supabase Auth:重定向到 Google.com 而不是我的应用程序

如何拥有 StreamProvider 的多个侦听器,其中稍后添加的侦听器接收最新数据?

Flutter:使用 GlobalKey 访问 BlocProvider

FutureProvider 不返回数据给 UI

Flutter Firebase 升级后出现问题? ARC 语义问题 (Xcode): Select 器appleCredentialWithIDToken:rawNonce:fullName:没有已知的类方法

启动画面中的淡入淡出图像

当我使用 Confetti Widget 时,Flutter Android 和 IOS 应用程序崩溃

Flutter 构建方法使用的是旧版本的变量?

Show Snackbar above to showModalBottomSheet Flutter

如何从 Firebase `get()` 获取 `DocumentReference`

在 flutter 中自定义 agora 视频通话 UI

gridview 的所有按钮都应该在Flutter 中适合其父容器

Flutter 平台通道将多数据传递给 windows 功能

在Flutter 中将数字转换为印度文字样式