Indeksowanie w Listview.builder
Odpowiedź, którą otrzymuję z mojego interfejsu REST API, wygląda następująco
{
"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
}
]
}
}
Używam FutureBuilder do obsługi pobierania danych, a FutureBuilder zwraca ListView.builder, którego używam do budowania mojego układu w zależności od liczby elementów w odpowiedzi
To jest kod mojego interfejsu użytkownika
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),
],
);
}
)
]
)
)
}
}
}
)
);
To jest błąd, który pojawia się, gdy próbuję wykonać snapshot.data.result.newsfeed [indeks] .author [indeks] .name lub użyć dowolnego elementu obiektu wewnątrz tablicy autora
Odpowiedzi
Jak wspomniał @xion, używasz newsfeedindeksu dla authortablicy. To, co powinieneś zrobić, to przypisać wszystkich autorów w każdym newsfeedelemencie do łańcucha, a następnie użyć tej wartości. Poniżej znajduje się kod, który daje wyobrażenie o tym, co należy zrobić. Ponieważ nie mam dostępu do twojego API, zakodowałem twoją odpowiedź JSON na stałe.
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)),
],
);
}),
]),
),
),
);
}
}
Zrzut ekranu:
Twój autor uzyskuje dostęp do tego samego indeksu z Twoim kanałem aktualności
być może potrzebujesz kolejnej pętli dla swojego autora
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
],
);
}
)