Загрузка данных из разбитого на страницы api flutter - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь получить данные с разбивкой на страницы из конечной точки 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. Хотел бы посоветовать, как исправить или улучшить эту ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...