Listview.builder에서 인덱싱

Nov 11 2020

내 REST API에서 얻은 응답은 다음과 같습니다.

{
    "result": {
        "newsfeed": [
            {
                "_id": "5fa52495f0e30a0017f4dccf",
                "video": null,
                "image": null,
                "author": [
                    {
                        "_id": "5f6a412d2ea9350017bec99f",
                        "userProfile": {
                            "visits": 0,
                            "bio": "Nothing for you ",
                            "gender": "Male",
                            "university": "Bells University Of Technology"
                        },
                        "name": "Jo Shaw ",
                        "__v": 0
                    }
                ],
                "text": "have you seen this ?",
                "campus": "Technology",
                "isLiked": false
            }
        ]
    }
}

FutureBuilder를 사용하여 데이터 가져 오기를 처리하고 FutureBuilder는 응답의 항목 수에 따라 레이아웃을 빌드하는 데 사용하는 ListView.builder를 반환합니다.

이것은 내 UI의 코드입니다.

     return Scaffold(
        body: FutureBuilder<TimelineModel>(
          future: _future,
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                return Text('none');
              case ConnectionState.waiting:
                return Center(
                  child: CircularProgressIndicator(),
                );
              case ConnectionState.active:
                return Text('');
              case ConnectionState.done:
                if (snapshot.hasError || snapshot.data == null) {
                  return Scaffold(
                    backgroundColor: Theme.of(context).backgroundColor,
                    body: Column(
                      children: [
                        Container(
                          child: Center(
                            child: Text("It's empty here"),
                          ),
                        ),
                      ],
                    ),
                  );
                }  else {
                  print("length: " +
                      snapshot.data.result.newsfeed.length.toString());
                  return RefreshIndicator(
                    onRefresh: _getData,
                    child: ListView(
                      children: [
                        ListView.builder(
                            itemCount: snapshot.data.result.newsfeed.length,
                            itemBuilder: (context, index) {
                              return Column(
                                      children: <Widgets>[
//This line of code works properly and no error is gotten 
                                    Text( snapshot.data.result.newsfeed[index].text),

//Once I put in this line of code, i receive a range error (RangeError (index): Invalid value: Only valid value is 0: 1)
                                  Text(snapshot.data.result.newsfeed[index].author[index].name),
                                 ],
                              );
                           }
                         )
                       ]
                     )
                   )
                 }
               }
             }
           )
         );

이 오류는 snapshot.data.result.newsfeed [index] .author [index] .name을 수행하거나 작성자 배열 내부의 객체에있는 항목을 사용하려고 할 때 표시되는 오류입니다.

답변

1 Pro Nov 12 2020 at 23:12

@xion이 언급했듯이 배열에 newsfeed인덱스를 사용하고 있습니다 author. 해야 할 일은 각 newsfeed항목 내의 모든 작성자 를 문자열에 할당 한 다음 해당 값을 대신 사용하는 것입니다. 다음은 수행해야 할 작업에 대한 아이디어를 제공하는 코드입니다. API에 대한 액세스 권한이 없기 때문에 json 응답을 하드 코딩했습니다.

class MyApp extends StatefulWidget {
  MyApp({Key key, this.title}) : super(key: key);

  final String title;

  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  var testJson = json.decode('''
  {
    "result": {
      "newsfeed": [
        {
          "_id": "5fa52495f0e30a0017f4dccf",
          "video": null,
          "image": null,
          "author": [
            {
              "_id": "5f6a412d2ea9350017bec99f",
              "userProfile": {
                "visits": 0,
                "bio": "Nothing for you ",
                "gender": "Male",
                "university": "Bells University Of Technology"
              },
              "name": "Jo Shaw ",
              "__v": 0
            },
            {
              "_id": "5f6a412d2ea9350017bec99f",
              "userProfile": {
                "visits": 0,
                "bio": "Nothing for you ",
                "gender": "Male",
                "university": "Bells University Of Technology"
              },
              "name": "Jo Shaw ",
              "__v": 0
            }
          ],
          "text": "have you seen this ?",
          "campus": "Technology",
          "isLiked": false
        }
      ]
    }
  }
  ''');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: Text(widget.title),
            ),
            body: Center(
              child: ListView(children: [
                ListView.builder(
                    scrollDirection: Axis.vertical,
                    shrinkWrap: true,
                    itemCount: testJson["result"]["newsfeed"].length,
                    itemBuilder: (context, index) {
                      String authors = '';
                      List<dynamic> authorsArray = testJson["result"]["newsfeed"][index]["author"];
                      for (int i = 0; i < authorsArray.length; i++) {
                        authors += i == (authorsArray.length - 1) ? authorsArray[i]["name"].toString() : authorsArray[i]["name"].toString() + ", ";
                      }
                      return Column(
                        children: [
                          Padding(
                            padding: EdgeInsets.all(10.0),
                            child: Text(
                              "Title: " +
                                  testJson["result"]["newsfeed"][index]["text"],
                              style: TextStyle(
                                  fontWeight: FontWeight.bold, fontSize: 18.0),
                            ),
                          ),
                          Text("Authors: " + authors,
                              style: TextStyle(
                                  color: Colors.black54,
                                  fontStyle: FontStyle.italic)),
                        ],
                      );
                    }),
              ]),
            ),
        ),
    );
  }
}

스크린 샷 :

xion Nov 12 2020 at 07:03

작성자가 뉴스 피드로 동일한 색인에 액세스하고 있습니다.

작성자를위한 또 다른 루프가 필요할 것입니다.

 ListView.builder(
                            itemCount: snapshot.data.result.newsfeed.length,
                            itemBuilder: (context, index) {
                              return Column(
                                      children: <Widgets>[
                                    Text( snapshot.data.result.newsfeed[index].text),
Text(snapshot.data.result.newsfeed[index].author[index].name), // <--- this line author[Index] hits error, not news the newsfeed
                                 ],
                              );
                           }
                         )