Flutter代码生成插件ferry_generator的使用
Flutter代码生成插件ferry_generator的使用
简介
ferry_generator
是一个用于生成完全类型化的 OperationRequest
的 Dart 代码生成器,这些请求可以与 ferry
客户端一起使用。它可以帮助开发者更方便地处理 GraphQL 请求,并确保类型安全。
GitHub项目信息
- License: MIT License
- PRs Welcome: 欢迎提交 PR
- Watch on GitHub: 关注项目
- Star on GitHub: 给项目加星
- Forks on GitHub: Fork 项目
- Discord: 加入 Discord 社区
安装和配置
在 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_generator
和 ferry_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
更多关于Flutter代码生成插件ferry_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用Flutter代码生成插件ferry_generator
的示例。ferry_generator
是一个用于生成GraphQL客户端代码的Dart包,它与ferry
包一起使用,可以大大简化与GraphQL服务器的交互。
前提条件
- 确保你的Flutter项目已经配置好GraphQL环境,包括
ferry
和ferry_exec
等依赖。 - 你需要有一个GraphQL服务器,并且你已经有了GraphQL的Schema文件(通常是一个
.graphql
文件)。
步骤
-
添加依赖
首先,在你的
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 # 请使用最新版本
-
创建GraphQL Schema文件
在你的项目根目录或指定的目录下创建一个
.graphql
文件,例如schema.graphql
,内容类似如下:schema { query: Query mutation: Mutation } type Query { hello: String } type Mutation { sayGoodbye: String }
-
定义GraphQL操作
在你的项目中创建一个
.graphql
文件,用于定义你的GraphQL操作。例如,创建一个operations.graphql
文件:query HelloQuery { hello } mutation SayGoodbyeMutation { sayGoodbye }
-
运行代码生成
在你的项目根目录下运行以下命令来生成代码:
flutter pub run build_runner build
这将生成与你的GraphQL操作对应的Dart文件。
-
使用生成的代码
生成的代码通常位于
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服务器的交互。