Я пытаюсь получить данные с разбивкой на страницы из конечной точки api во флаттере. Я использую библиотеку rxdart
с dio
для управления запросами api. Вот репозиторий:
class EventRepository {
Future<EventResponse> getEvents({page}) async {
try {
var response = await apiCall.getData('events?page=$page&limit=10&q=');
var data = response.data;
return EventResponse.fromJson(data);
} catch (error, stacktrace) {
print("Exception occured: $error stackTrace: $stacktrace");
}
}
}
Вот eventBlo c:
class EventBloc {
final EventRepository _repository = EventRepository();
final BehaviorSubject<EventResponse> _subject =
BehaviorSubject<EventResponse>();
getEvents({page}) async {
EventResponse response = await _repository.getEvents(page: page ?? 1);
_subject.sink.add(response);
}
dispose() {
_subject.close();
}
BehaviorSubject<EventResponse> get subject => _subject;
}
final eventBloc = EventBloc();
List<Event> eventList = List<Event>();
StreamBuilder<EventResponse>(
stream: eventBloc.subject.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.error != null &&
snapshot.data.error.length > 0) {
return ShowError(
error: snapshot.data.error,
onTap: () => eventBloc.getEvents(),
);
} else if (snapshot.data.data.data.length == 0) {
return EmptyWidget("No resources added yet.");
} else {
updateList(snapshot.data.data.data);
return ListView(
children: <Widget>[
buildList(data: eventList),
(page < snapshot.data.data.totalPages)
? Container(
padding: const EdgeInsets.all(20),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
onTap: () {
setState(() {
page++;
});
eventBloc.getEvents(page: page);
},
child: Text("View More",
style: Theme.of(context)
.textTheme
.subtitle1
.copyWith(color: Colors.blue)))
],
),
)
: Text("End of Results.",
style: Theme.of(context).textTheme.subtitle1),
],
);
}
} else if (snapshot.hasError) {
return Center(
child: Text('${snapshot.error}'),
);
} else {
return Center(child: LoadingWidget(text: "Fetching events"));
}
}),
Здесь, когда я получаю данные, я обновляю eventList, а buildList возвращает построитель listView, который показывает eventData. Проблема в том, что в списке появляются дубликаты. Это вроде работает, но это хакерский лог c. Хотел бы посоветовать, как исправить или улучшить эту ситуацию.