#json #api #listview #flutter #future
#json #API #просмотр списка #flutter #будущее
Вопрос:
Я хочу Futurebuilder
внутри другого Futurebuilder
. У меня есть JSON
и я хочу отобразить имена пользователей внутри CircleAvatars
, чтобы была видна только первая буква!
Я много раз менял классы и их формирование, пытаясь заставить это работать, но, похоже, у меня никогда не получается!
Я получаю эти ошибки:
flutter: было выдано другое исключение: NoSuchMethodError: для null был вызван параметр getter ‘length’.
flutter: было выдано другое исключение: NoSuchMethodError: метод ‘[]’ был вызван в null.
JSON:
{
"id": 81,
"users": [
{
"username": "hugo",
"fullname": "Hugo Johnsson"
},
{
"username": "studentone",
"fullname": "Student One"
}
],
"title": "test med teacher chat",
"description": "This project does not have a description.",
"subject": "No subject",
"deadline": "2019-01-06",
"days_left": "107 days ago",
"overview_requests": [
{
"id": 28,
"user": {
"username": "hugo",
"fullname": "Hugo Johnsson"
},
"group": 81
}
]
}
Классы внутри Flutter:
class Project {
final int id;
final String title;
final String description;
final String deadline;
final String subject;
final String days_left;
final List<USER> users;
Project(
this.id,
this.title,
this.description,
this.deadline,
this.subject,
this.days_left,
this.users
);
}
class USER {
final String username;
final String fullname;
USER(
this.username,
this.fullname
);
}
Будущее:
Future<List<Project>> _getProjects() async {
var data = await http.get(
"http://studieplaneraren.pythonanywhere.com/api/projects/${UserLog().Username}/?format=json");
var jsonData = json.decode(data.body); //an array of json objects
List<Project> allProjects = [];
for (var JData in jsonData) {
Project project = Project(
JData["id"],
JData["title"],
JData["description"],
JData["deadline"],
JData["subject"],
JData["days_left"],
JData[USER("username", "fullname")]
);
allProjects.add(project);
}
return allProjects;
}
CircleAvatars:
//CIRCLE AVATARS
Container(
margin: EdgeInsets.only(top: 10, left: 8, right: 8),
height: 40,
child: FutureBuilder(
future: _getProjects(),
builder: (context, snapshot) => ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, userIndex) =>
CircleAvatar(
foregroundColor: Colors.white,
backgroundColor: UserLog().Color,
child: Text(snapshot.data[index].users[userIndex].username[0]),
)
)
)
),
Ответ №1:
Попробуйте это
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
class FutureBuilderJSON extends StatefulWidget {
FutureBuilderJSON({Key key}) : super(key: key);
_FutureBuilderJSONState createState() => _FutureBuilderJSONState();
}
class _FutureBuilderJSONState extends State<FutureBuilderJSON> {
Future<List<Project>> _getProjects() async {
var data = await http.get(
"http://studieplaneraren.pythonanywhere.com/api/projects/hugo/?format=json");
var jsonData = json.decode(data.body); //an array of json objects
List<Project> allProjects = [];
for (var JData in jsonData) {
Project project = Project(
JData["id"],
JData["title"],
JData["description"],
JData["deadline"],
JData["subject"],
JData["days_left"],
JData["users"],
);
allProjects.add(project);
}
return allProjects;
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 10, left: 8, right: 8),
child: FutureBuilder<List<Project>>(
future: _getProjects(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
var users = snapshot.data[index].users;
String username =
users != null ? users[0]['username'] : 'Default';
var oneChar = username.substring(0, 1).toUpperCase();
return CircleAvatar(
foregroundColor: Colors.white,
backgroundColor: Colors.blue,
child: Text(oneChar),
);
},
);
},
),
);
}
}
class Project {
final int id;
final String title;
final String description;
final String deadline;
final String subject;
final String days_left;
final List<dynamic> users;
Project(
this.id,
this.title,
this.description,
this.deadline,
this.subject,
this.days_left,
this.users,
);
}
class User {
final String username;
final String fullname;
User(this.username, this.fullname);
}
Комментарии:
1. Большое спасибо, чувак 🙂 Только одна проблема — я получаю букву H во всех ячейках, а не H … S…
2. Да, потому что ответ json возвращает «hugo» во всех записях
3. Что вы хотите отобразить? Я выбираю имя пользователя, а затем беру первый символ свойства username
4. Я хочу вернуть пользователей H и S
Ответ №2:
Вы можете попробовать следующий код.
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
class FutureBuilderJSON extends StatefulWidget {
FutureBuilderJSON({Key key}) : super(key: key);
_FutureBuilderJSONState createState() => _FutureBuilderJSONState();
}
class _FutureBuilderJSONState extends State<FutureBuilderJSON> {
Future<List<Project>> _getProjects() async {
var data = await http.get(
"http://studieplaneraren.pythonanywhere.com/api/projects/hugo/?format=json");
var jsonData = json.decode(data.body); //an array of json objects
List<Project> allProjects = [];
for (var JData in jsonData) {
Project project = Project(
JData["id"],
JData["title"],
JData["description"],
JData["deadline"],
JData["subject"],
JData["days_left"],
JData["users"],
);
allProjects.add(project);
}
return allProjects;
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 10, left: 8, right: 8),
child: FutureBuilder<List<Project>>(
future: _getProjects(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
List<dynamic> users = snapshot.data[index].users;
List<Widget> ws = List<Widget>();
users.forEach((u) {
var oneChar = u['username'].substring(0, 1).toUpperCase();
var w = CircleAvatar(
foregroundColor: Colors.white,
backgroundColor: Colors.blue,
child: Text(oneChar),
);
ws.add(w);
});
// String username =
// users != null ? users[0]['username'] : 'Default';
// var oneChar = username.substring(0, 1).toUpperCase();
// return CircleAvatar(
// foregroundColor: Colors.white,
// backgroundColor: Colors.blue,
// child: Text(oneChar),
// );
return Column(
children: ws,
);
},
);
},
),
);
}
}
class Project {
final int id;
final String title;
final String description;
final String deadline;
final String subject;
final String days_left;
final List<dynamic> users;
Project(
this.id,
this.title,
this.description,
this.deadline,
this.subject,
this.days_left,
this.users,
);
}
class User {
final String username;
final String fullname;
User(this.username, this.fullname);
}
Комментарии:
1. Я все еще получаю H в каждой ячейке,
2. Проверьте этот скриншот imgur.com/a/IzzOeWY и вот вам полный исходный код github.com/santoshanand/stackoverflow-flutter