QueryBloc<TData> constructor

QueryBloc<TData>({
  1. required GraphQLClient client,
  2. required WatchQueryOptions<Object?> options,
})

Implementation

QueryBloc({required this.client, required WatchQueryOptions options})
    : super(QueryState<TData>.initial()) {
  on<QueryEventRun<TData>>(
    _run,
    transformer: runTransformer?.call(),
  );
  on<QueryEventError<TData>>(
    _error,
    transformer: errorTransformer?.call(),
  );
  on<QueryEventLoading<TData>>(
    _loading,
    transformer: loadingTransformer?.call(),
  );
  on<QueryEventLoaded<TData>>(
    _loaded,
    transformer: loadedTransformer?.call(),
  );
  on<QueryEventRefetch<TData>>(
    _refetch,
    transformer: refetchTransformer?.call(),
  );
  on<QueryEventFetchMore<TData>>(
    _fetchMore,
    transformer: fetchMoreTransformer?.call(),
  );

  result = client.watchQuery<void>(options);

  _subscription = result.stream.listen((QueryResult result) {
    if (state is QueryStateRefetch &&
        result.source == QueryResultSource.cache &&
        options.fetchPolicy == FetchPolicy.cacheAndNetwork) {
      return;
    }

    final exception = result.exception;

    if (exception != null) {
      TData? data;

      if (result.data != null) {
        data = parseData(result.data);
      }

      if (!isClosed) {
        add(QueryEvent<TData>.error(
          error: exception,
          result: result,
          data: data,
        ));
      }
    }

    if (result.isLoading && result.data == null) {
      if (!isClosed) {
        add(QueryEvent.loading(result: result));
      }
    }

    if (!result.isLoading && result.data != null) {
      if (!isClosed) {
        add(
          QueryEvent<TData>.loaded(
            data: parseData(result.data),
            result: result,
          ),
        );
      }
    }
  });
}