#flutter #api #rest
Вопрос:
Я продолжаю получать ошибку, упомянутую выше, во время выполнения моего приложения flutter. В основном я пытаюсь получить данные из api и отобразить их в виде списка сливерлиста с помощью FutureBuilder.
Это работало отлично, пока я не изменил свой код для списка с 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),
);
});
}
Я не знаю, чего именно мне не хватает, потому что этот код работает, если я использую тип dynamic вместо пользовательского класса EntertainerEvent.
Заранее всем вам спасибо!
Ответ №1:
Заверните его в hasData
:
if(snapshot.hasData){
return SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
List<EntertainerEvent> someData = snapshot.data;
print('data here');
//Do some stuff
}, childCount: childCount),
);}
return CircularProgressIndicator();
Комментарии:
1. Привет, спасибо вам за вашу помощь. К сожалению, это нецелесообразно, так как null может быть возвращен, если основной код завершается нормально. См.Ошибку ниже: Тело может завершиться нормально, в результате чего будет возвращено значение «null», но возвращаемый тип является потенциально ненулевым типом. (Документация) Попробуйте добавить в конце оператор return или throw.
2. Вот почему я добавил последний возврат, загрузочный счетчик, снаружи
if(hasData)
3. Да, я заметил это, но это выдает ошибку «Порт просмотра ожидал появления дочернего элемента типа renderssliver, но получил дочерний элемент типа RenderPositionedBox». Это связано с загрузкой