簡體   English   中英

使用listView.builder時出現noSuchMethodError elementAt

[英]noSuchMethodError elementAt while using listView.builder

當我print(snapshot.data)數據時,..但顯示時看起來像這樣,這是我的代碼

  _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"
  },

]

首先解決以下問題,然后如果有更多錯誤,請更新您的問題,我將嘗試改善答案。

snapshot.hasData是布爾值,它永遠不會為null。

更改

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

現在,您將可以使用創建列表標題

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

請記住,json是區分大小寫的,因此請仔細檢查您是否正確拼寫了密鑰。

我認為您正在嘗試從數據庫或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]),
              );

            });
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM