Reputation: 317
The response i get from my REST api looks like this
{
"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
}
]
}
}
I am using a FutureBuilder to handle fetching the data and the FutureBuilder returns a ListView.builder which i use to build my layout depending on the number of items in the response
This is the code for my 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),
],
);
}
)
]
)
)
}
}
}
)
);
This is the error seen when i try to do snapshot.data.result.newsfeed[index].author[index].name or use any of the items in the object inside the author array
Upvotes: 0
Views: 763
Reputation: 3003
As @xion mentioned, you are using newsfeed
index for author
array. What you should do is assign all authors within each newsfeed
item to string and then use that value instead. Below is the code to give you an idea on what you should do. Since i don't have access to your API, i hardcoded your json response.
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)),
],
);
}),
]),
),
),
);
}
}
Screenshot:
Upvotes: 1
Reputation: 1259
your author is accessing the same index with your newsfeed
perhaps you should need another loop for your author
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
],
);
}
)
Upvotes: 0