Я создаю конструктор Listview с помощью метода get (вызов API). Вызов API в порядке, потому что я получаю ответ. Но в виджете snapshot.data мне показывают ноль. Я не могу решить эту проблему и не знаю, почему она так себя ведет. Пожалуйста, помогите мне.
тело ответа API
Вот мой код для вызова API
class APIService {
Future<List<EducationInfo>> getEducationInfo() async {
String url = "$baseAPIUrl/educations";
String _token = await SavedData().loadToken();
String authorization = "Bearer $_token";
var response = await http.get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
"Authorization": authorization
});
print('API ${response.statusCode}\n API${json.decode(response.body)}');
if (response.statusCode == 200) {
var jsonResponse = response.body;
var decoded = json.decode(jsonResponse);
return decoded['success']
.map<EducationInfo>((b) => EducationInfo.fromJson(b))
.toList();
} else {
throw Exception('Failed to load Education Information');
}
}
}
Вот мой Model.dart
//Model
class EducationInfo {
int id;
String degreeName;
int rollNumber;
int regNumber;
int passingYear;
String gradeType;
double cgpa;
double outOfCgpa;
String divisionName;
String groupName;
String subjectName;
String boardName;
String instituteName;
EducationInfo({
this.id,
this.degreeName,
this.rollNumber,
this.regNumber,
this.passingYear,
this.gradeType,
this.cgpa,
this.outOfCgpa,
this.divisionName,
this.groupName,
this.subjectName,
this.boardName,
this.instituteName,
});
factory EducationInfo.fromJson(Map<String, dynamic> json) {
return EducationInfo(
id: json['user_id'],
degreeName: json['degree_name'],
rollNumber: json['roll_number'],
regNumber: json['registration_number'],
passingYear: json['passing_year'],
gradeType: json['grade_type'],
cgpa: json['cgpa'],
outOfCgpa: json['out_of_cgpa'],
divisionName: json['division'],
groupName: json['group_name'],
subjectName: json['subject_name'],
boardName: json['board'],
instituteName: json['institute_name'],
);
}
}
И вот мой основной код-
class Resume extends StatefulWidget {
@override
_ResumeState createState() => _ResumeState();
}
class _ResumeState extends State<Resume> {
Future<List<EducationInfo>> furuteEducationInfo;
@override
void initState() {
super.initState();
furuteEducationInfo = APIService().getEducationInfo();
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: false,
appBar: AppBar(
automaticallyImplyLeading: false,
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
),
onPressed: () {
Navigator.pop(context);
},
),
title: Text("Resume"),
),
body: Align(
child: FutureBuilder(
future: furuteEducationInfo,
builder: (context, snapshot) {
var educationInfo = snapshot.data;
if (snapshot.data == null) {
return Text("No Data Available ");
} else if (snapshot.hasData) {
return ListView.builder(
scrollDirection: Axis.vertical,
itemCount: educationInfo.length,
itemBuilder: (context, index) {
var eduInfo = educationInfo[index];
print(
"\nEducation Info ${educationInfo[index]}");
return designedContainer(
_width - 30,
Padding(
padding: EdgeInsets.all(5.0),
child: Stack(
children: [
Container(
child: Column(
children: [
detailsField(
"Degree Name",
"${_checkNull(eduInfo.degreeName)}"),
],
),
),
Align(
alignment:
Alignment.topRight,
child: editButton(
Icons.add, "Delete",
() {
print("Delete");
}),
)
],
),
));
});
} else {
Text("Something Went to Wrong");
}
}),
),
);
}
А вот и почтальон Скриншот-
AsyncSnapshot<List<EducationInfo>>(ConnectionState.done, null, тип int не является подтипом типа double)
поэтому у вас есть ошибка: snapshot.error установлен на: «тип 'int' не является подтипом типа 'double'"
в вашем EducationInfo.fromJson
методе
заменять
cgpa: json['cgpa'] ?? 0.0,
outOfCgpa: json['out_of_cgpa'] ?? 0.0,
Поскольку это будущее и работает асинхронно, вам нужно проверить, есть ли в моментальном снимке данные, и дождаться получения данных. Следуя коду фрагмента, как вы могли бы проверить это внутри вашего метода сборки:
(snapshot.hasData && snapshot.data.length == 0)
? Container(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Congrats, No jobs asssigned!!!")
],
),
),
)
: (snapshot.hasData)
? Container(
child: ListView.builder(
.....)
добавьте
print(snapshot);
передvar educationInfo = snapshot.data;
- что вы видите в логах?