Skip to content

Commit 750ca05

Browse files
committed
feat(graphql_flutter): Decouple GraphQLClient Provider
1 parent 90e5d45 commit 750ca05

File tree

7 files changed

+132
-8
lines changed

7 files changed

+132
-8
lines changed

packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,20 @@ class MutationHookResult<TParsed> {
2020

2121
MutationHookResult<TParsed> useMutation<TParsed>(
2222
MutationOptions<TParsed> options,
23+
) {
24+
final client = useGraphQLClient();
25+
return useMutationOnClient(client, options);
26+
}
27+
28+
MutationHookResult<TParsed> useMutationOnClient<TParsed>(
29+
GraphQLClient client,
30+
MutationOptions<TParsed> options,
2331
) {
2432
final watchOptions = useMemoized(
2533
() => options.asWatchQueryOptions(),
2634
[options],
2735
);
28-
final client = useGraphQLClient();
29-
final query = useWatchMutation<TParsed>(watchOptions);
36+
final query = useWatchMutationOnClient<TParsed>(client, watchOptions);
3037
final snapshot = useStream(
3138
query.stream,
3239
initialData: query.latestResult ?? QueryResult.unexecuted,

packages/graphql_flutter/lib/src/widgets/hooks/query.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter_hooks/flutter_hooks.dart';
22
import 'package:graphql/client.dart';
3+
import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart';
34
import 'package:graphql_flutter/src/widgets/hooks/watch_query.dart';
45

56
// method to call from widget to fetchmore queries
@@ -22,11 +23,19 @@ class QueryHookResult<TParsed> {
2223
}
2324

2425
QueryHookResult<TParsed> useQuery<TParsed>(QueryOptions<TParsed> options) {
26+
final client = useGraphQLClient();
27+
return useQueryOnClient(client, options);
28+
}
29+
30+
QueryHookResult<TParsed> useQueryOnClient<TParsed>(
31+
GraphQLClient client,
32+
QueryOptions<TParsed> options,
33+
) {
2534
final watchQueryOptions = useMemoized(
2635
() => options.asWatchQueryOptions(),
2736
[options],
2837
);
29-
final query = useWatchQuery(watchQueryOptions);
38+
final query = useWatchQueryOnClient(client, watchQueryOptions);
3039
final snapshot = useStream(
3140
query.stream,
3241
initialData: query.latestResult,

packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ QueryResult<TParsed> useSubscription<TParsed>(
2020
OnSubscriptionResult<TParsed>? onSubscriptionResult,
2121
}) {
2222
final client = useGraphQLClient();
23+
return useSubscriptionOnClient(
24+
client,
25+
options,
26+
onSubscriptionResult: onSubscriptionResult,
27+
);
28+
}
29+
30+
QueryResult<TParsed> useSubscriptionOnClient<TParsed>(
31+
GraphQLClient client,
32+
SubscriptionOptions<TParsed> options, {
33+
OnSubscriptionResult<TParsed>? onSubscriptionResult,
34+
}) {
2335
final stream = use(_SubscriptionHook(
2436
client: client,
2537
onSubscriptionResult: onSubscriptionResult,

packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ ObservableQuery<TParsed> useWatchQuery<TParsed>(
6666
WatchQueryOptions<TParsed> options,
6767
) {
6868
final client = useGraphQLClient();
69+
return useWatchQueryOnClient(client, options);
70+
}
71+
72+
ObservableQuery<TParsed> useWatchQueryOnClient<TParsed>(
73+
GraphQLClient client,
74+
WatchQueryOptions<TParsed> options,
75+
) {
6976
final overwrittenOptions = useMemoized(() {
7077
final policies =
7178
client.defaultPolicies.query.withOverrides(options.policies);
@@ -79,8 +86,16 @@ ObservableQuery<TParsed> useWatchQuery<TParsed>(
7986
}
8087

8188
ObservableQuery<TParsed> useWatchMutation<TParsed>(
82-
WatchQueryOptions<TParsed> options) {
89+
WatchQueryOptions<TParsed> options,
90+
) {
8391
final client = useGraphQLClient();
92+
return useWatchMutationOnClient(client, options);
93+
}
94+
95+
ObservableQuery<TParsed> useWatchMutationOnClient<TParsed>(
96+
GraphQLClient client,
97+
WatchQueryOptions<TParsed> options,
98+
) {
8499
final overwrittenOptions = useMemoized(() {
85100
final policies =
86101
client.defaultPolicies.mutate.withOverrides(options.policies);

packages/graphql_flutter/lib/src/widgets/mutation.dart

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:flutter_hooks/flutter_hooks.dart';
33
import 'package:graphql/client.dart';
4+
import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart';
45
import 'package:graphql_flutter/src/widgets/hooks/mutation.dart';
56

67
typedef MutationBuilder<TParsed> = Widget Function(
@@ -9,7 +10,7 @@ typedef MutationBuilder<TParsed> = Widget Function(
910
);
1011

1112
/// Builds a [Mutation] widget based on the a given set of [MutationOptions]
12-
/// that streams [QueryResult]s into the [QueryBuilder].
13+
/// that streams [QueryResult]s into the [MutationBuilder].
1314
class Mutation<TParsed> extends HookWidget {
1415
const Mutation({
1516
final Key? key,
@@ -22,7 +23,32 @@ class Mutation<TParsed> extends HookWidget {
2223

2324
@override
2425
Widget build(BuildContext context) {
25-
final result = useMutation(options);
26+
final client = useGraphQLClient();
27+
return MutationOnClient(
28+
client: client,
29+
options: options,
30+
builder: builder,
31+
);
32+
}
33+
}
34+
35+
/// Builds a [MutationOnClient] widget based on the a given set of [MutationOptions]
36+
/// that streams [QueryResult]s into the [MutationBuilder].
37+
class MutationOnClient<TParsed> extends HookWidget {
38+
const MutationOnClient({
39+
final Key? key,
40+
required this.client,
41+
required this.options,
42+
required this.builder,
43+
}) : super(key: key);
44+
45+
final GraphQLClient client;
46+
final MutationOptions<TParsed> options;
47+
final MutationBuilder<TParsed> builder;
48+
49+
@override
50+
Widget build(BuildContext context) {
51+
final result = useMutationOnClient(client, options);
2652
return builder(result.runMutation, result.result);
2753
}
2854
}

packages/graphql_flutter/lib/src/widgets/query.dart

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:flutter_hooks/flutter_hooks.dart';
33
import 'package:graphql/client.dart';
4+
import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart';
45
import 'package:graphql_flutter/src/widgets/hooks/query.dart';
56

67
typedef QueryBuilder<TParsed> = Widget Function(
@@ -23,7 +24,32 @@ class Query<TParsed> extends HookWidget {
2324

2425
@override
2526
Widget build(BuildContext context) {
26-
final result = useQuery(options);
27+
final client = useGraphQLClient();
28+
return QueryOnClient(
29+
options: options,
30+
builder: builder,
31+
client: client,
32+
);
33+
}
34+
}
35+
36+
/// Builds a [QueryOnClient] widget based on the a given set of [QueryOptions]
37+
/// that streams [QueryResult]s into the [QueryBuilder].
38+
class QueryOnClient<TParsed> extends HookWidget {
39+
const QueryOnClient({
40+
final Key? key,
41+
required this.options,
42+
required this.builder,
43+
required this.client,
44+
}) : super(key: key);
45+
46+
final GraphQLClient client;
47+
final QueryOptions<TParsed> options;
48+
final QueryBuilder<TParsed> builder;
49+
50+
@override
51+
Widget build(BuildContext context) {
52+
final result = useQueryOnClient(client, options);
2753
return builder(
2854
result.result,
2955
fetchMore: result.fetchMore,

packages/graphql_flutter/lib/src/widgets/subscription.dart

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:flutter_hooks/flutter_hooks.dart';
33
import 'package:graphql/client.dart';
4+
import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart';
45
import 'package:graphql_flutter/src/widgets/hooks/subscription.dart';
56

67
/// Creats a subscription with [GraphQLClient.subscribe].
@@ -67,7 +68,35 @@ class Subscription<TParsed> extends HookWidget {
6768

6869
@override
6970
Widget build(BuildContext context) {
70-
final result = useSubscription<TParsed>(
71+
final client = useGraphQLClient();
72+
return SubscriptionOnClient(
73+
client: client,
74+
options: options,
75+
builder: builder,
76+
);
77+
}
78+
}
79+
80+
/// Creats a subscription widget like [Subscription] but
81+
/// with an external client.
82+
class SubscriptionOnClient<TParsed> extends HookWidget {
83+
const SubscriptionOnClient({
84+
required this.client,
85+
required this.options,
86+
required this.builder,
87+
this.onSubscriptionResult,
88+
Key? key,
89+
}) : super(key: key);
90+
91+
final GraphQLClient client;
92+
final SubscriptionOptions<TParsed> options;
93+
final SubscriptionBuilder<TParsed> builder;
94+
final OnSubscriptionResult<TParsed>? onSubscriptionResult;
95+
96+
@override
97+
Widget build(BuildContext context) {
98+
final result = useSubscriptionOnClient<TParsed>(
99+
client,
71100
options,
72101
onSubscriptionResult: onSubscriptionResult,
73102
);

0 commit comments

Comments
 (0)