【问题标题】:noSuchMethodError elementAt while using listView.buildernoSuchMethodError elementAt 使用 listView.builder 时
【发布时间】:2019-11-25 22:58:03
【问题描述】:

当我print(snapshot.data) 时,数据就在那里,.. 但显示时它会出现 like this 这是我的代码

  _showActivities() {
return FutureBuilder(
  future: UserController.getActivityByDate(
      {"date": widget.index.toIso8601String(), "id": widget.user}),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      if (snapshot.data != null){
        print(snapshot.data);
      return ListView.builder(
          itemCount: snapshot.data.length,
          itemBuilder: (context, position) {
            var item = snapshot.data[position];
            return ListTile(
              title: Text("${item["activity"]["project"]}"),
              subtitle: Text(item["created_at"]),
            );
          });
      }

    } 
      return Text("no data displayed");

  },
);

这是我要显示的数据

[


{
    "id": 114,
    "id_user": 114,
    "activity": {
      "code": 2003,
      "project": "Sangat Damai Sejahtera",
      "activity": {
        "name": "Laporan Sales Order Trading",
        "id_process_snapshot": 5016
      },
      "code_name": "SaveProcessSnapshot"
    },
    "created_at": "2019-07-12T17:00:13.931592+07:00"
  },

]

【问题讨论】:

    标签: flutter flutter-web


    【解决方案1】:

    首先修复以下问题,如果有更多错误,请更新您的问题,我会尝试改进答案。

    snapshot.hasData 是一个布尔值,它永远不会为空。

    改变

    if (snapshot.hasData != null)
    

    if (snapshot.hasData)
    

    如果你真的想检查 null 使用以下(但 hasData 应该足够了)。

    if (snapshot.data != null)
    

    然后修复您在图像更改中显示的错误

    snapshot.data.elementAt(position);
    

    snapshot.data[position]; //if the object being returned is a list
    

    getActivityByDate 返回一个 json,因此最好从 json 创建对象。下面是一些伪代码,用于从 JSON 创建 User 和 Activity 对象。

    import 'package:json_annotation/json_annotation.dart'; //add json_annotation: ^2.2.0 in your pubspec
    
    @JsonSerializable(nullable: false)
    class User extends Object {
      int id, id_user;
      String created_at;
      Activity activity;
    
      User({this.id,this.id_user,this.activity,this.created_at});
    
      User _userFromJson(Map<String, dynamic>json){
        return new User(
          id: json["id"] as int,
          id_user: json["id_user"] as int,
          activity: new Activity()._activityFromJson(json["activity"]),
          created_at: json["created_at"] as String,
        );
      }
    }
    class Activity extends Object {
      int code, id_process_snapshot;
      String project, name, code_name;
    
      Activity({this.code,this.name, this.id_process_snapshot,this.project,this.code_name});
    
      Activity _activityFromJson(Map<String, dynamic>json){
        return new Activity(
          code: json["code"] as int,
          project: json["project"] as String,
          name: json["activity"]["name"] as String,
          id_process_snapshot: json["activity"]["id_process_snapshot"] as int,
          code_name:  json["activity"]["code_name"] as String,
        );
      }
    }
    

    返回您的代码,通过 _userFromJson() 方法传递您的 json

    User user = User()._userFromJson(snapshot.data);
    

    现在您可以使用

    创建您的 listTiles
    return ListTile(
                  title: Text("${user.project} -${user.activity.code_name;}"),
                  subtitle: Text("${user.created_at}"),
                );
    

    记住 json 区分大小写,因此请仔细检查您是否正确拼写键。

    【讨论】:

    • 我尝试替换它但错误仍然相同??
    • 好的,我已经用所需的最后更改更新了我的答案。更改 elementAt。
    • 现在错误不同了,我已经更新了图片和问题
    • 谢谢,snapshot.data 返回的对象是什么?您可以使用调试器和断点在应用程序检索数据后但在引发异常之前暂停应用程序。
    • 很抱歉,在flutter web上似乎不支持断点,但是当print ()有数据时,我是如何显示json的问题??
    【解决方案2】:

    我认为您正在尝试从数据库或 api 中获取值,请尝试下面的代码,函数 _getAllValues() 将所有列表返回给构建器

    body: FutureBuilder<List<String>>(
        future: _getAllValues(),
          builder:(BuildContext context, AsyncSnapshot<List<String>> list){
          if(list.hasData){
            return new ListView.builder(
                itemCount: list.data.length,
                itemBuilder:(context, index){
                  return ListTile(
                    title: Text(list.data[index]),
                  );
    
                });
          }
    

    【讨论】:

    • 如果我想显示["activity"] ["project"]怎么办??
    猜你喜欢
    • 2022-07-28
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2017-11-01
    相关资源
    最近更新 更多