使用Flutter中的ferry来实现GraphQL客户端
为了对使用Flutter作为GraphQL API的感觉有所了解,我进行了简单的调查,并做了笔记。
使用的库
由于发现有相应的文件并且它们得到了积极的维护,所以我们决定采用ferry。
除了这些选项外,还有GraphQL、Flutter GraphQL、Artemis等,但在撰写本文时。
-
- Stable版がNull-Safety対応していない
-
- フェッチしたデータの型付け処理のためのコードの自動生成に対応していない
- 動作が不安定っぽい
由于一些原因,我决定不再使用这些。
操作步骤
GraphQL的服务器
我使用了 GraphQL Faker。
按照README的指示搭建服务器,将创建一个GraphQL的端点,地址为http://localhost:9002/graphqh。
用 Flutter 开发的项目
渡轮的引进
在Flutter项目中,通过以下命令添加所需的软件包。
flutter pub add ferry
flutter pub add gql_http_link
flutter pub add -d ferry_generator
flutter pub add -d build_runner
自动生成Dart代码
将 GraphQL Faker 默认设置的数据结构模式保存为 lib/graphql/schema.graphql。
type Company {
id: ID
name: String
industry: String
employees: [Employee!] @listLength(min: 5, max: 10)
}
type Employee {
id: ID
firstName: String
lastName: String
address: String
subordinates: [Employee!] @listLength(min: 0, max: 3)
company: Company
}
type Query {
employee(id: ID): Employee
company(id: ID): Company
allCompanies: [Company!]
}
我们将创建一个名为lib/graphql/employee.query.graphql的数据获取模式。
query GetEmployees {
employee {
id
}
}
将构建设置文件命名为 build.yaml。以下是几乎与文档相同的描述。将 your_package_name 替换为项目名称。
targets:
$default:
sources:
- lib/**
builders:
gql_build|schema_builder:
enabled: true
gql_build|ast_builder:
enabled: true
gql_build|data_builder:
enabled: true
options:
schema: your_package_name|lib/schema.graphql
gql_build|var_builder:
enabled: true
options:
schema: your_package_name|lib/schema.graphql
gql_build|serializer_builder:
enabled: true
options:
schema: your_package_name|lib/schema.graphql
ferry_generator|req_builder:
enabled: true
options:
schema: your_package_name|lib/schema.graphql
执行以下命令,自动生成GraphQL客户端代码。
flutter pub run build_runner build
API实现的调用
使用自动生成的代码,创建名为lib/graphql.dart的类来调用GraphQL的API,如下所示。
class GraphQlAPIClient {
late final Client _client;
GraphQlAPIClient() {
final link = HttpLink(
'http://localhost:9002/graphql',
);
this._client = Client(link: link);
}
void listenEmployees() async {
final request = GGetEmployeesReq();
_client.request(request).listen((event) {
final data = event.data;
if (data != null) {
print('Employee ID: ${data.employee?.id}');
}
});
}
}
然后,从适当的位置调用准备好的方法。
void main() {
final graphQlClient = GraphQlAPIClient();
graphQlClient.listenEmployees();
// ...
}
请注意,由于服务器指向本地主机,所以该代码只能在模拟器或仿真器中运行。