【发布时间】:2021-10-20 10:16:44
【问题描述】:
我在 Flutter 应用程序运行时不断收到上述错误。基本上我想要实现的是从 api 获取数据并使用 FutureBuilder 以 SliverList 的形式显示它。
在我将列表的代码从 FutureBuilder 更改为 FutureBuilder
以使用 EntertainerEvent 类之前,它工作得非常好,该类具有我需要从 json 文件中显示的所有字段。
我该如何解决这个问题,因为当我使用自定义类时,构造函数或应用程序本身似乎没有获取数据。
这是 EntertainerEvent 类的代码:
class EntertainerEvent {
final int eventId;
final int entertainerId;
final int eventTypeId;
final int categoryId;
final String eventName;
final String description;
final String imagePoster;
final String location;
final DateTime startDate;
final DateTime endDate;
final double entreeFee;
const EntertainerEvent({required this.eventId, required this.entertainerId, required this.eventTypeId,
required this.categoryId, required this.eventName, required this.description, required this.imagePoster,
required this.location, required this.startDate, required this.endDate, required this.entreeFee});
factory EntertainerEvent.fromJson(Map<String, dynamic> event) {
return EntertainerEvent(
eventId: event['EventID'],
entertainerId: event['EntertainerID'],
eventTypeId: event['EventTypeID'],
categoryId: event['CategoryID'],
eventName: event['EventName'],
description: event['Description'],
imagePoster: event['ImagePoster'],
location: event['Location'],
startDate: event['StartDate'],
endDate: event['EndDate'],
entreeFee: event['EntryFee'],
);
}
}
下面是从api获取数据的代码:
Future<List<EntertainerEvent>> fetchEvents() async {
var result = await http.get(Uri.parse(apiUrl));
if (result.statusCode == 200) {
var content = result.body;
var arr = json.decode(content) as List;
return arr.map((eve) => new EntertainerEvent.fromJson(eve)).toList();
} else {
print('Not loaded');
throw Exception('Unable to fetch data from the Rest API');
}
}
late Future<List<EntertainerEvent>> _fetchEvents;
@override
void initState() {
_fetchEvents = fetchEvents();
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<EntertainerEvent>>(
future: _fetchEvents,
builder: (BuildContext context, AsyncSnapshot snapshot) {
var childCount = 0;
if (snapshot.connectionState != ConnectionState.done) {
childCount = 1;
} else {
childCount = snapshot.data.length;
}
return SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
if (snapshot.hasData) {
List<EntertainerEvent> someData = snapshot.data;
print('data here');
//Do some stuff
}
}, childCount: childCount),
);
});
}
我不知道我到底错过了什么,因为如果我使用动态类型而不是自定义类 EntertainerEvent,则此代码有效。
提前谢谢大家!
【问题讨论】: