flutter - LateInitializationError:字段“___”尚未初始化
问题描述
我得到了 LateInitializationError: Field '_subjects@100178445' has not been initialized 以下代码错误。
Json 响应如下。
{
"success": 1,
"subject": [
{
"subject_id": "5e32874c714fa",
"subject_name": "Account",
"image": "upload/subject/Account.png",
"active": "1",
"standard_id": "5d1594e283e1a",
"medium_id": "5d15938aa1344"
},
{
"subject_id": "5da9ff659fb7c",
"subject_name": "Biology",
"image": "upload/subject/03_logo-1164x484.png",
"active": "1",
"standard_id": "5d1594e283e1a",
"medium_id": "5d15938aa1344"
},
{
"subject_id": "5da9ff990b1c6",
"subject_name": "Chemisty",
"image": "upload/subject/02_logo-1168x490.png",
"active": "1",
"standard_id": "5d1594e283e1a",
"medium_id": "5d15938aa1344"
},
{
"subject_id": "5de76afbd064e",
"subject_name": "Computer",
"image": "upload/subject/07_logo-1169x486.png",
"active": "1",
"standard_id": "5d1594e283e1a",
"medium_id": "5d15938aa1344"
},
{
"subject_id": "5d788906c431b",
"subject_name": "Devsatya Paperset March 2020",
"image": "upload/subject/04_logo-1174x491.png",
"active": "1",
"standard_id": "5d1594e283e1a",
"medium_id": "5d15938aa1344"
}
]
}
在 subject_model.dart 文件中的模型类如下。
// To parse this JSON data, do
//
// final subjectByUser = subjectByUserFromJson(jsonString);
import 'dart:convert';
SubjectByUser subjectByUserFromJson(String str) =>
SubjectByUser.fromJson(json.decode(str));
String subjectByUserToJson(SubjectByUser data) => json.encode(data.toJson());
class SubjectByUser {
SubjectByUser({
required this.success,
required this.subject,
});
int success;
List<Subject> subject;
factory SubjectByUser.fromJson(Map<String, dynamic> json) => SubjectByUser(
success: json["success"],
subject:
List<Subject>.from(json["subject"].map((x) => Subject.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"success": success,
"subject": List<dynamic>.from(subject.map((x) => x.toJson())),
};
}
class Subject {
Subject({
required this.subjectId,
required this.subjectName,
required this.image,
required this.active,
required this.standardId,
required this.mediumId,
});
String subjectId;
String subjectName;
String image;
String active;
String standardId;
String mediumId;
factory Subject.fromJson(Map<String, dynamic> json) => Subject(
subjectId: json["subject_id"],
subjectName: json["subject_name"],
image: json["image"],
active: json["active"],
standardId: json["standard_id"],
mediumId: json["medium_id"],
);
Map<String, dynamic> toJson() => {
"subject_id": subjectId,
"subject_name": subjectName,
"image": image,
"active": active,
"standard_id": standardId,
"medium_id": mediumId,
};
}
我在 apimanager.dart 文件中创建了如下函数
class ApiManager {
static const String subjectUrl =
"http://192.168.43.160/sahjanand/api/subject/get_by_user_plan?user_id=609cab2cd5b6c&order_id=1620889722609cd07a601af469889697609cab2cd5b6c&standard_id=5d1594e283e1a&medium_id=5d15938aa1344";
static Future<List<SubjectByUser>> getSubjectByUser() async {
try {
final response = await http.get(Uri.parse(subjectUrl));
if (response.statusCode == 200) {
final List<SubjectByUser> subjects =
subjectByUserFromJson(response.body) as List<SubjectByUser>;
print(subjects);
return subjects;
} else {
return <SubjectByUser>[];
}
} catch (e) {
// ignore: deprecated_member_use
return <SubjectByUser>[];
}
}
}
并查看 homepage.dart 文件中的代码,如下所示。
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late List<SubjectByUser> _subjects;
late bool _loading;
@override
void initState() {
// TODO: implement initState
super.initState();
_loading = true;
ApiManager.getSubjectByUser().then((subjects) {
setState(() {
_subjects = subjects;
_loading = false;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(_loading ? 'Loading...' : 'Subjects'),
),
body: Center(
child: ListView.builder(
itemCount: null == _subjects ? 0 : _subjects.length,
itemBuilder: (context, index) {
SubjectByUser subjectByUser = _subjects[index];
return ListTile(
title: Text(subjectByUser.success.toString()),
subtitle: Text(subjectByUser.subject.length.toString()),
);
}),
),
);
}
}
我得到了 LateInitializationError: Field '_subjects@100178445' has not been initialized 错误。所以请帮助我如何解决这个错误。
解决方案
您在 ListView.builder 中调用 _subjects 进行比较,但到那时 _subjects 尚未初始化,因此会引发错误,您可以将 _subjects 初始化为空列表
final _subjects = <SubjectByUser>[];
然后,一旦您获得数据,您就可以将所有数据添加到其中。
ApiManager.getSubjectByUser().then((subjects) {
setState(() {
_subject..clear()..addAll(subjects);
_loading = false;
});
});
在 itemCount 中,您可以简单地拥有
itemCount: _subjects.length,