11import 'dart:async' ;
22
3+ import 'package:graphql/src/utilities/helpers.dart' ;
34import 'package:graphql/src/utilities/response.dart' ;
45import 'package:meta/meta.dart' ;
56import 'package:collection/collection.dart' ;
@@ -19,20 +20,29 @@ import 'package:graphql/src/scheduler/scheduler.dart';
1920
2021import 'package:graphql/src/core/_query_write_handling.dart' ;
2122
22- bool Function (dynamic a, dynamic b) _deepEquals =
23- const DeepCollectionEquality ().equals;
23+ typedef DeepEqualsFn = bool Function (dynamic a, dynamic b);
24+
25+ /// The equality function used for comparing cached and new data.
26+ ///
27+ /// You can alternatively provide [optimizedDeepEquals] for a faster
28+ /// equality check. Or provide your own via [GqlClient] constructor.
29+ DeepEqualsFn gqlDeepEquals = const DeepCollectionEquality ().equals;
2430
2531class QueryManager {
2632 QueryManager ({
2733 required this .link,
2834 required this .cache,
2935 this .alwaysRebroadcast = false ,
36+ DeepEqualsFn ? deepEquals,
3037 bool deduplicatePollers = false ,
3138 }) {
3239 scheduler = QueryScheduler (
3340 queryManager: this ,
3441 deduplicatePollers: deduplicatePollers,
3542 );
43+ if (deepEquals != null ) {
44+ gqlDeepEquals = deepEquals;
45+ }
3646 }
3747
3848 final Link link;
@@ -551,7 +561,8 @@ class QueryManager {
551561 ) =>
552562 cachedData != null &&
553563 query.latestResult != null &&
554- (alwaysRebroadcast || ! _deepEquals (query.latestResult! .data, cachedData));
564+ (alwaysRebroadcast ||
565+ ! gqlDeepEquals (query.latestResult! .data, cachedData));
555566
556567 void setQuery (ObservableQuery <Object ?> observableQuery) {
557568 queries[observableQuery.queryId] = observableQuery;
0 commit comments