Flutter GraphQL数据请求插件graphql_repository的使用
Flutter GraphQL 数据请求插件 graphql_repository 的使用
功能特性
- 简易的设置与配置
- 支持查询(queries)、变更(mutations)和订阅(subscriptions)
- 内置错误处理和日志记录
- 可自定义的身份验证
使用方法
首先,确保你已经安装了 graphql_repository
包。在 pubspec.yaml
文件中添加依赖项:
dependencies:
graphql_repository: ^x.x.x
然后运行 flutter pub get
来获取依赖项。
配置 GraphQL 客户端
创建一个 GraphQLClientConfiguration
实例,并配置你的 GraphQL 终端地址以及获取认证令牌的逻辑:
import 'package:graphql_repository/graphql_repository.dart';
final graphQLClientConfig = GraphQLClientConfiguration(
endpoint: 'https://your-graphql-endpoint.com/graphql', // 替换为你的 GraphQL 终端地址
getToken: () async {
// 获取令牌的逻辑,例如从安全存储中获取
return 'your-auth-token'; // 替换为你的实际令牌
},
);
创建客户端
使用上述配置创建一个 GraphQLClient
实例:
final client = graphQLClientConfig.createClient();
将应用包装在 GraphQLProvider
中
将应用包装在 GraphQLProvider
中以便在整个应用中共享 GraphQLClient
:
return GraphQLProvider(
client: ValueNotifier<GraphQLClient>(client),
child: MaterialApp(
title: '你的应用标题',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
),
);
创建数据仓库
创建一个继承自 GraphQLBaseRepository
的类来封装 GraphQL 操作:
class MyRepository extends GraphQLBaseRepository {
MyRepository(GraphQLClientConfiguration config) : super(config);
// 获取用户信息的方法
Future<Map<String, dynamic>> getUser(String id) async {
const query = '''
query GetUser(\$id: ID!) {
user(id: \$id) {
id
name
email
}
}
''';
final result = await performQuery<Map<String, dynamic>>(
query,
variables: {'id': id}, // 传递变量
);
return result['user']; // 返回用户信息
}
// 更新用户信息的方法
Future<Map<String, dynamic>> updateUser(String id, String name, String email) async {
const mutation = '''
mutation UpdateUser(\$id: ID!, \$name: String!, \$email: String!) {
updateUser(id: \$id, name: \$name, email: \$email) {
id
name
email
}
}
''';
final result = await performMutation<Map<String, dynamic>>(
mutation,
variables: {'id': id, 'name': name, 'email': email}, // 传递变量
);
return result['updateUser']; // 返回更新后的用户信息
}
// 订阅用户更新的方法
Stream<Map<String, dynamic>> userUpdates(String id) {
const subscription = '''
subscription OnUserUpdated(\$id: ID!) {
userUpdated(id: \$id) {
id
name
email
}
}
''';
return performSubscription<Map<String, dynamic>>(
subscription,
variables: {'id': id}, // 传递变量
);
}
}
提取响应头
从响应上下文中提取头部信息:
final result = response.data!['something'];
final HttpLinkResponseContext? responseContext =
result.context.entry<HttpLinkResponseContext>();
final Map<String, String?> responseHeaders = responseContext?.headers ?? {};
更多关于Flutter GraphQL数据请求插件graphql_repository的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter GraphQL数据请求插件graphql_repository的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用graphql_repository
插件进行数据请求的示例代码。graphql_repository
通常用于管理和抽象GraphQL数据请求,使得数据获取逻辑与UI代码分离,更易于测试和维护。
首先,确保你的pubspec.yaml
文件中包含了必要的依赖:
dependencies:
flutter:
sdk: flutter
graphql_flutter: ^5.0.0
graphql: ^5.0.0
equatable: ^2.0.3 # 用于比较对象相等性
graphql_repository: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装这些依赖。
1. 定义GraphQL客户端
创建一个GraphQL客户端配置,以便与你的GraphQL服务器通信。
import 'package:graphql_flutter/graphql_flutter.dart';
final HttpLink httpLink = HttpLink(
'https://your-graphql-endpoint.com/graphql',
);
final ValueNotifier<GraphQLClient> client = ValueNotifier(
GraphQLClient(
link: httpLink,
cache: GraphQLCache(),
),
);
2. 定义GraphQL查询和变量
假设你有一个简单的GraphQL查询,用于获取用户信息。
const String getUserQuery = r'''
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
''';
3. 创建Repository
创建一个Repository类来处理数据请求逻辑。
import 'package:equatable/equatable.dart';
import 'package:graphql/client.dart';
import 'package:graphql_repository/graphql_repository.dart';
class User extends Equatable {
final String id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
@override
List<Object?> get props => [id, name, email];
}
class UserRepository extends QueryRepository<User> {
UserRepository(GraphQLClient client) : super(client);
@override
Future<User?> parseData(QueryResult result) async {
if (result.hasException) {
throw result.exception!;
}
final userData = result.data!['user'];
if (userData == null) {
return null;
}
return User(
id: userData['id']! as String,
name: userData['name']! as String,
email: userData['email']! as String,
);
}
@override
Options<Map<String, dynamic>> buildOptions(User? idOrVars) {
if (idOrVars == null) {
throw ArgumentError('User ID is required');
}
return Options(
document: gql(getUserQuery),
variables: {'id': idOrVars.id},
);
}
}
4. 使用Repository在UI中请求数据
在你的Flutter组件中使用UserRepository
来请求数据。
import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
MultiProvider(
providers: [
Provider<GraphQLClient>.value(value: client),
Provider<UserRepository>(
create: (_) => UserRepository(client.value),
),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: UserScreen(),
);
}
}
class UserScreen extends StatefulWidget {
@override
_UserScreenState createState() => _UserScreenState();
}
class _UserScreenState extends State<UserScreen> {
late UserRepository userRepository;
User? user;
bool isLoading = true;
String? errorMessage;
@override
void initState() {
super.initState();
userRepository = Provider.of<UserRepository>(context);
userRepository.watch(
User(id: '123'), // 替换为实际的用户ID
onError: (e) => setState(() => errorMessage = e.toString()),
onCompleted: (result) => setState(() {
user = result;
isLoading = false;
}),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('User Info'),
),
body: Center(
child: isLoading
? CircularProgressIndicator()
: user != null
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Name: ${user!.name}'),
Text('Email: ${user!.email}'),
],
)
: Text(errorMessage ?? 'No user data'),
),
);
}
}
这个示例展示了如何配置GraphQL客户端、定义GraphQL查询、创建Repository来处理数据请求逻辑,并在UI中使用该Repository来显示用户信息。请根据你的实际需求调整代码,特别是GraphQL查询和服务器端点。