import 'dart:async'; import 'package:fl_query/fl_query.dart'; import 'package:fl_query_hooks/src/use_query_client.dart'; import 'package:fl_query_hooks/src/utils/use_updater.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; InfiniteQuery useInfiniteQuery( String queryKey, InfiniteQueryFn queryFn, { required InfiniteQueryNextPage nextPage, required PageType initialPage, RetryConfig? retryConfig, RefreshConfig? refreshConfig, JsonConfig? jsonConfig, ValueChanged>? onData, ValueChanged>? onError, bool enabled = true, List? keys, }) { final rebuild = useUpdater(); final client = useQueryClient(); final query = useMemoized>(() { final query = client.createInfiniteQuery( queryKey, queryFn, initialParam: initialPage, nextPage: nextPage, jsonConfig: jsonConfig, refreshConfig: refreshConfig, retryConfig: retryConfig, ); return query; }, [queryKey]); useEffect(() { final removeListener = query.addListener(rebuild); if (enabled) { query.fetch(); } return removeListener; }, [query, enabled]); useEffect(() { query.updateQueryFn(queryFn); return null; }, [queryFn, query]); useEffect(() { query.updateNextPageFn(nextPage); return null; }, [nextPage, query]); useEffect(() { StreamSubscription>? dataSubscription; StreamSubscription>? errorSubscription; if (onData != null) { dataSubscription = query.dataStream.listen(onData); } if (onError != null) { errorSubscription = query.errorStream.listen(onError); } return () { dataSubscription?.cancel(); errorSubscription?.cancel(); }; }, [onData, onError, query]); return query; }