Flutter GraphQL数据请求插件graphql_repository的使用

发布于 1周前 作者 ionicwang 来自 Flutter

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

1 回复

更多关于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查询和服务器端点。

回到顶部