Flutter代码生成插件ferry_generator的使用

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

Flutter代码生成插件ferry_generator的使用

简介

ferry_generator 是一个用于生成完全类型化的 OperationRequest 的 Dart 代码生成器,这些请求可以与 ferry 客户端一起使用。它可以帮助开发者更方便地处理 GraphQL 请求,并确保类型安全。

GitHub项目信息

安装和配置

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  ferry: ^0.12.0
  ferry_flutter: ^0.12.0

dev_dependencies:
  build_runner: ^2.0.0
  ferry_generator: ^0.12.0

然后运行以下命令来安装依赖项:

flutter pub get

使用示例

1. 创建 GraphQL 查询文件

创建一个新的文件 lib/graphql/get_user.graphql,内容如下:

query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

2. 配置 build.yaml

为了确保 ferry_generator 可以找到并生成代码,需要在项目的根目录下创建或编辑 build.yaml 文件:

targets:
  $default:
    builders:
      ferry_generator|gql_builder:
        enabled: true
        options:
          schema_path: lib/graphql/schema.json

3. 运行代码生成

运行以下命令来生成代码:

flutter pub run build_runner build --delete-conflicting-outputs

这将在 lib/graphql/ 目录下生成相应的 Dart 文件。

4. 使用生成的代码

在你的 Dart 文件中导入生成的代码,并使用它来执行查询:

import 'package:ferry/ferry.dart';
import 'package:ferry_flutter/ferry_flutter.dart';
import 'package:get_user.graphql.dart'; // 生成的文件

final client = Client(
  link: HttpLink('https://your-graphql-endpoint.com/graphql'),
  cache: Cache(),
);

void getUser(int userId) async {
  final op = GET_USER(\$id: userId);
  final response = await client.request(op).first;

  if (response.data != null) {
    print('User: ${response.data.user.name}');
  } else {
    print('Error: ${response.errors}');
  }
}

5. 完整示例

下面是一个完整的示例应用程序,展示了如何使用 ferry_generatorferry_flutter 来执行 GraphQL 查询:

import 'package:flutter/material.dart';
import 'package:ferry/ferry.dart';
import 'package:ferry_flutter/ferry_flutter.dart';
import 'package:get_user.graphql.dart'; // 生成的文件

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

class MyApp extends StatelessWidget {
  final Client client = Client(
    link: HttpLink('https://your-graphql-endpoint.com/graphql'),
    cache: Cache(),
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GraphQLProvider(
        client: client,
        child: UserScreen(),
      ),
    );
  }
}

class UserScreen extends StatelessWidget {
  final int userId = 1; // 示例用户ID

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('User Details')),
      body: Query<GET_USER>(
        operation: GET_USER(\$id: userId),
        builder: (QueryResult result, { VoidCallback? refetch }) {
          if (result.loading) {
            return Center(child: CircularProgressIndicator());
          }

          if (result.data?.user != null) {
            final user = result.data!.user;
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Name: ${user.name}'),
                  Text('Email: ${user.email}'),
                ],
              ),
            );
          }

          return Center(child: Text('No data found'));
        },
      ),
    );
  }
}

通过以上步骤,你可以轻松地使用 ferry_generator 来生成类型安全的 GraphQL 请求代码,并将其集成到 Flutter 应用程序中。希望这个指南对你有所帮助!如果有任何问题,欢迎随时提问。


更多关于Flutter代码生成插件ferry_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码生成插件ferry_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter代码生成插件ferry_generator的示例。ferry_generator是一个用于生成GraphQL客户端代码的Dart包,它与ferry包一起使用,可以大大简化与GraphQL服务器的交互。

前提条件

  1. 确保你的Flutter项目已经配置好GraphQL环境,包括ferryferry_exec等依赖。
  2. 你需要有一个GraphQL服务器,并且你已经有了GraphQL的Schema文件(通常是一个.graphql文件)。

步骤

  1. 添加依赖

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

    dependencies:
      ferry: ^x.y.z  # 请使用最新版本
      ferry_exec: ^x.y.z  # 请使用最新版本
    
    dev_dependencies:
      build_runner: ^x.y.z  # 用于代码生成
      ferry_generator: ^x.y.z  # 请使用最新版本
    
  2. 创建GraphQL Schema文件

    在你的项目根目录或指定的目录下创建一个.graphql文件,例如schema.graphql,内容类似如下:

    schema {
      query: Query
      mutation: Mutation
    }
    
    type Query {
      hello: String
    }
    
    type Mutation {
      sayGoodbye: String
    }
    
  3. 定义GraphQL操作

    在你的项目中创建一个.graphql文件,用于定义你的GraphQL操作。例如,创建一个operations.graphql文件:

    query HelloQuery {
      hello
    }
    
    mutation SayGoodbyeMutation {
      sayGoodbye
    }
    
  4. 运行代码生成

    在你的项目根目录下运行以下命令来生成代码:

    flutter pub run build_runner build
    

    这将生成与你的GraphQL操作对应的Dart文件。

  5. 使用生成的代码

    生成的代码通常位于build/generated/目录下(具体路径可能因配置而异)。你可以直接在你的Dart代码中导入并使用这些生成的类。例如:

    import 'package:your_app/generated/graphql.dart';  // 根据实际路径调整
    
    void main() async {
      // 假设你已经配置好了ferry客户端
      final client = /* 你的ferry客户端 */;
    
      // 执行查询
      final result = await client.request(HelloQuery()).first;
      print('Hello: ${result.data?.hello}');
    
      // 执行突变
      final mutationResult = await client.mutate(SayGoodbyeMutationMutation());
      print('Goodbye: ${mutationResult.data?.sayGoodbye}');
    }
    

注意事项

  • 确保你的schema.graphql文件是最新的,并且与你的GraphQL服务器保持一致。
  • 如果你更改了operations.graphql文件,你需要重新运行flutter pub run build_runner build来生成新的代码。
  • 生成的代码文件通常不需要手动编辑,因为它们是由ferry_generator根据你的GraphQL操作自动生成的。

通过上述步骤,你就可以在Flutter项目中使用ferry_generator来生成GraphQL客户端代码,从而简化与GraphQL服务器的交互。

回到顶部