Flutter GraphQL客户端通信插件gql_link的使用

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

Flutter GraphQL客户端通信插件gql_link的使用

项目信息

MIT License PRs Welcome Watch on GitHub Star on GitHub Forks on GitHub Discord

gql_link 是一个模块化的基于AST的GraphQL请求执行接口。它允许开发者通过组合不同的链接(Links)来构建复杂的GraphQL请求处理逻辑。

A hypothetical Link setup

设置Link

设置Link的方式有很多,可以通过组合其他Link来实现。下面是一个简单的例子,展示了如何使用 Link.from 方法组合多个Link:

import "package:gql_link/gql_link.dart";
import "package:gql_dedupe_link/gql_dedupe_link.dart";
import "package:gql_http_link/gql_http_link.dart";

import "./my_custom_link.dart";

void main () {
  final link = Link.from([
    MyCustomLink(),
    DedupeLink(),
    HttpLink("/graphql"),
  ]);
}

要使用Link执行GraphQL操作,必须确保Link以终止Link(如 HttpLink)结束。

使用Link

当Link设置完成后,需要将GraphQL操作封装在 Request 中,并通过 link.request(request) 来执行:

import "package:gql/language.dart";
import "package:gql_exec/gql_exec.dart";
import "package:gql_link/gql_link.dart";

class MyLinkContext extends ContextEntry {
  final int value;

  const MyLinkContext(this.value);

  @override
  List<Object> get fieldsForEquality => [];
}

class MyLink extends Link {
  @override
  Stream<Response> request(Request request, [forward]) => Stream.fromIterable(
        [
          Response(
            data: <String, dynamic>{
              "context": request.context.entry<MyLinkContext>()?.value,
            },
            response: <String, dynamic>{
              "data": <String, dynamic>{
                "context": request.context.entry<MyLinkContext>()?.value,
              }
            },
          ),
        ],
      );
}

void main() async {
  final link = MyLink();

  for (var i = 0; i < 10; i++) {
    final first = await link
        .request(
          Request(
            operation: Operation(
              document: parseString(""),
            ),
            context: Context.fromMap(
              <Type, ContextEntry>{
                MyLinkContext: MyLinkContext(i),
              },
            ),
          ),
        )
        .first;

    print(first.data);
  }
}

实现自定义Link

Link设计为可组合的。如果需要添加自定义行为,可以继承 Link 类来实现自己的Link。如果你更喜欢函数式编程风格,可以使用 LinkFunctionLink.function。如果需要根据某些条件将请求路由到不同的Link,可以使用 Link.route(LinkRouter route)

功能和Bug

请在 GitHub 上提交功能请求和Bug报告。

完整示例Demo

下面是一个完整的示例,展示了如何在Flutter应用中使用 gql_link 插件进行GraphQL通信。

pubspec.yaml

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  gql_link: ^0.4.0
  gql_http_link: ^0.4.0
  gql_dedupe_link: ^0.4.0
  gql: ^0.7.0

main.dart

接下来是 main.dart 文件的内容:

import 'package:flutter/material.dart';
import 'package:gql/language.dart';
import 'package:gql_exec/gql_exec.dart';
import 'package:gql_link/gql_link.dart';
import 'package:gql_http_link/gql_http_link.dart';
import 'package:gql_dedupe_link/gql_dedupe_link.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Link link = Link.from([
    DedupeLink(),
    HttpLink('https://api.spacex.land/graphql/'),
  ]);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter GraphQL Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GraphQLPage(link: link),
    );
  }
}

class GraphQLPage extends StatefulWidget {
  final Link link;

  GraphQLPage({required this.link});

  @override
  _GraphQLPageState createState() => _GraphQLPageState();
}

class _GraphQLPageState extends State<GraphQLPage> {
  String query = """
  query GetLaunches {
    launchesPast(limit: 10) {
      mission_name
      launch_date_local
    }
  }
  """;

  late Stream<Response> _stream;

  @override
  void initState() {
    super.initState();
    _stream = widget.link.request(
      Request(
        operation: Operation(document: parseString(query)),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter GraphQL Demo'),
      ),
      body: StreamBuilder<Response>(
        stream: _stream,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            final data = snapshot.data!.data as Map<String, dynamic>;
            final launches = data['launchesPast'] as List<dynamic>;

            return ListView.builder(
              itemCount: launches.length,
              itemBuilder: (context, index) {
                final launch = launches[index];
                return ListTile(
                  title: Text(launch['mission_name']),
                  subtitle: Text(launch['launch_date_local']),
                );
              },
            );
          } else if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中使用 gql_link 插件与GraphQL API进行通信,并展示从API获取的数据。希望这个示例能帮助你更好地理解和使用 gql_link 插件。


更多关于Flutter GraphQL客户端通信插件gql_link的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter GraphQL客户端通信插件gql_link的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中使用GraphQL客户端通信插件gql_link,以下是一个简单的代码示例,展示了如何配置和使用gql_link来进行GraphQL查询。

首先,确保你的pubspec.yaml文件中已经添加了必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  gql: ^0.16.0  # 请确保使用最新版本
  gql_http_link: ^0.4.0  # 请确保使用最新版本
  gql_link: ^0.4.0  # 请确保使用最新版本

然后,你可以按照以下步骤在Flutter项目中使用gql_link进行GraphQL查询:

  1. 配置HTTP Link和Cache

    import 'package:flutter/material.dart';
    import 'package:gql/client.dart';
    import 'package:gql_http_link/gql_http_link.dart';
    import 'package:gql_link/gql_link.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: GraphQLDemo(),
        );
      }
    }
    
    class GraphQLDemo extends StatefulWidget {
      @override
      _GraphQLDemoState createState() => _GraphQLDemoState();
    }
    
    class _GraphQLDemoState extends State<GraphQLDemo> {
      late final Link _link;
      late final GraphQLClient _client;
    
      @override
      void initState() {
        super.initState();
    
        // 配置HTTP Link
        final HttpLink httpLink = HttpLink(
          uri: 'https://your-graphql-endpoint.com/graphql',  // 替换为你的GraphQL服务端地址
        );
    
        // 配置缓存(可选)
        final Cache cache = InMemoryCache();
    
        // 使用Link的链式调用将HTTP Link和Cache结合起来
        _link = httpLink.concat(cache.link);
    
        // 创建GraphQLClient
        _client = GraphQLClient(
          link: _link,
          cache: cache,
        );
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('GraphQL Demo'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () async {
                // 在这里执行GraphQL查询
                await performQuery();
              },
              child: Text('Perform Query'),
            ),
          ),
        );
      }
    
      Future<void> performQuery() async {
        final String query = """
          query {
            viewer {
              id
              login
            }
          }
        """;
    
        final Request request = Request(
          query: query,
        );
    
        final Result result = await _client.query(request);
    
        if (result.hasErrors) {
          print('Errors: ${result.errors!.map((e) => e.message).join(", ")}');
        } else {
          print('Data: ${result.data}');
        }
      }
    }
    
  2. 运行应用

    确保你的开发环境已经正确设置,并且你的GraphQL服务端正在运行。然后运行Flutter应用,点击按钮即可执行GraphQL查询,并在控制台中看到查询结果。

这个示例展示了如何使用gql_linkgql_http_link来配置GraphQL客户端,并执行一个简单的查询。你可以根据需要修改查询语句和服务端地址。

回到顶部