Initialize GraphQL Client
Problem
You need to initialize the GraphQL client with proper configuration, middleware (TypedLinks), cache handlers, and authentication token management.
GraphQL Client Initialization
Section titled “GraphQL Client Initialization”The GraphQL client uses a builder pattern with TypedLinks middleware for request processing:
Riverpod Provider Approach
Section titled “Riverpod Provider Approach”@Riverpod(keepAlive: true)GqlClient gqlClient(Ref ref) { final cacheHandler = ref.read(cacheHandlerProvider);
GqlClientBuilder.addTypedLink( PriorityTypedLink(processingDelay: const Duration(milliseconds: 500)), );
GqlClientBuilder.init( options: GqlClientOptions( httpEndpoint: '${const String.fromEnvironment('BASE_URL')}/graphqllayer/GraphQLMutation/Mutation', keepAlive: const Duration(seconds: 60), updateCacheHandlers: cacheHandler.handlers, ), );
final client = GqlClientBuilder.getInstance(); return client;}TypedLink Middleware
Section titled “TypedLink Middleware”TypedLinks are middleware that process requests before they reach the terminating HTTP link:
Priority TypedLink
Section titled “Priority TypedLink”GqlClientBuilder.addTypedLink( PriorityTypedLink(processingDelay: const Duration(milliseconds: 500)),);Custom Authentication TypedLink
Section titled “Custom Authentication TypedLink”class AuthTypedLink extends TypedLink { @override Stream<OperationResponse<TData, TVars>> request<TData, TVars>( OperationRequest<TData, TVars> request, NextTypedLink forward, ) { final token = AuthService.instance.currentToken;
final modifiedRequest = request.rebuild((b) => b ..context = request.context.rebuild((cb) => cb ..entry<HttpLinkHeaders>(HttpLinkHeaders.key)?.headers.addAll({ 'Authorization': 'Bearer $token', }) ?? cb.entry(HttpLinkHeaders.key, HttpLinkHeaders(headers: { 'Authorization': 'Bearer $token', })) ) );
return forward(modifiedRequest); }}Logging TypedLink
Section titled “Logging TypedLink”class LoggingTypedLink extends TypedLink { @override Stream<OperationResponse<TData, TVars>> request<TData, TVars>( OperationRequest<TData, TVars> request, NextTypedLink forward, ) { print('🚀 GraphQL Request: ${request.operation.operationName}');
return forward(request).map((response) { if (response.hasErrors) { print('❌ GraphQL Error: ${response.graphqlErrors}'); } else { print('✅ GraphQL Success: ${request.operation.operationName}'); } return response; }); }}Client Configuration Options
Section titled “Client Configuration Options”GqlClientOptions
Section titled “GqlClientOptions”GqlClientOptions( httpEndpoint: 'https://api.example.com/graphql', keepAlive: const Duration(seconds: 60), updateCacheHandlers: cacheHandler.handlers, defaultHeaders: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, connectTimeout: const Duration(seconds: 30), receiveTimeout: const Duration(seconds: 30),)Environment Configuration
Section titled “Environment Configuration”const baseUrl = String.fromEnvironment('BASE_URL', defaultValue: 'http://localhost:3000');const graphqlEndpoint = '$baseUrl/graphqllayer/GraphQLMutation/Mutation';Authentication Token Management
Section titled “Authentication Token Management”Update Token
Section titled “Update Token”void updateAuthToken(String token) { GqlClientBuilder.updateToken(token);}Token Refresh Example
Section titled “Token Refresh Example”class AuthService { void onTokenRefresh(String newToken) { GqlClientBuilder.updateToken(newToken); }
void onLogout() { GqlClientBuilder.updateToken(''); }}TypedLink Chain Order
Section titled “TypedLink Chain Order”TypedLinks are processed in the order they’re added:
GqlClientBuilder.addTypedLink(LoggingTypedLink());GqlClientBuilder.addTypedLink(AuthTypedLink());GqlClientBuilder.addTypedLink(PriorityTypedLink(processingDelay: const Duration(milliseconds: 500)));Processing Order:
- LoggingTypedLink - Logs requests and responses
- AuthTypedLink - Adds authentication headers
- PriorityTypedLink - Handles request prioritization
- HttpLink - Terminating link that makes HTTP requests
Key Benefits
Section titled “Key Benefits”- Middleware Chain - TypedLinks provide flexible request/response processing
- Authentication - Easy token management with
updateToken() - Caching - Integrated cache handler support
- Priority Handling - Built-in request prioritization
- Environment Config - Flexible endpoint configuration
- Singleton Pattern - Single client instance across the app
Next Steps
Section titled “Next Steps”- Learn how to register GraphQL requests
- Understand cache handling strategies
- Implement optimistic updates