Flutter GraphQL客户端插件graphql_switch的使用
Flutter GraphQL客户端插件graphql_switch的使用
GraphQL Switch
GraphQL Switch
是一个受 Relay 启发的 GraphQL 框架。
import "flutter_hooks/flutter_hooks.dart";
import "graphql_switch/graphql_switch.dart";
import "./MyWidgetQuery.graphql.dart";
import "./MyWidgetAvatarFragment.graphql.dart";
class MyWidget extends HookWidget {
[@override](/user/override)
Widget build(BuildContext context) {
// 使用 useQuery$MyWidgetQuery 钩子查询数据
const data = useQuery$MyWidgetQuery(
graphql("""
query MyWidgetQuery {
person {
name
age
avatar {
...MyWidgetAvatar
}
}
}
""")
);
return Row(
children: [
// 显示头像组件
MyWidgetAvatar(
data.person.avatar
),
// 显示姓名和年龄
Text("${data.person.name} (age ${data.person.age})"),
]
);
}
}
class MyWidgetAvatar extends HookWidget {
// 定义头像片段的键
final MyWidgetAvatarFragment$key avatarKey;
const MyWidgetAvatar(this.avatarKey);
[@override](/user/override)
Widget build(BuildContext context) {
// 使用 useFragment$MyWidgetAvatarFragment 钩子获取头像片段数据
const data = useFragment$MyWidgetAvatarFragment(
graphql("""
fragment MyWidgetAvatarFragment on Avatar {
url
}
"""),
);
return Image.network(data.url);
}
}
class MaybeMyWidgetAvatar extends HookWidget {
// 可能为空的头像片段的键
final MaybeMyWidgetAvatarFragment$key? avatarKey;
const MaybeMyWidgetAvatar(this.avatarKey);
[@override](/user/override)
Widget build(BuildContext context) {
// 使用 useFragment$MaybeMyWidgetAvatarFragment 钩子获取头像片段数据
const data = useFragment$MaybeMyWidgetAvatarFragment(
graphql("""
fragment MaybeMyWidgetAvatarFragment on Avatar {
url
}
"""),
);
final url = data?.url;
if (url == null) {
return Text('No image');
}
return Image.network(url);
}
}
Dart 代码分析
- 查找
graphql(...)
来自package:graphql_switch
并生成钩子。 - 将生成的文件与 Dart 文件放置在一起。
- (?)假设每个文件内的操作/片段名称唯一,并在不一致时抛出错误。
- (?)对于片段,从可空键生成可空输出,从可迭代键生成可迭代输出。
GraphQL 代码分析
- 通常遵循
graphql_codegen
的序列化器,对片段进行特殊处理。- 为字段和具体类型添加序列化器。
- 而不是展开片段,使序列化器实现
$key
接口。 - 其他片段也不应展开子片段的字段。
Linting
- 通过 lint 强制执行操作(和片段)的命名,使其可选。
- 检查字段是否在组件中使用并进行 lint。
完整示例
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:your_package_name/graphql_switch/graphql_switch.dart'; // 替换为实际的包名
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(), // 使用你定义的 MyWidget 组件
),
),
);
}
}
更多关于Flutter GraphQL客户端插件graphql_switch的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter GraphQL客户端插件graphql_switch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
graphql_switch
是一个 Flutter 插件,用于在 Flutter 应用中轻松切换不同的 GraphQL 客户端。这个插件特别适用于需要根据不同的环境(如开发、测试、生产)或不同的用户角色来切换 GraphQL 客户端的场景。
安装
首先,你需要在 pubspec.yaml
文件中添加 graphql_switch
依赖:
dependencies:
flutter:
sdk: flutter
graphql_switch: ^1.0.0 # 请根据实际情况使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
-
导入包
在你的 Dart 文件中导入
graphql_switch
:import 'package:graphql_switch/graphql_switch.dart';
-
创建 GraphQL 客户端
你可以使用
graphql_flutter
或其他 GraphQL 客户端库来创建不同的 GraphQL 客户端。例如:import 'package:graphql_flutter/graphql_flutter.dart'; final client1 = GraphQLClient( cache: GraphQLCache(), link: HttpLink('https://api1.example.com/graphql'), ); final client2 = GraphQLClient( cache: GraphQLCache(), link: HttpLink('https://api2.example.com/graphql'), );
-
配置 GraphQLSwitch
使用
GraphQLSwitch
来管理这些客户端,并根据需要切换:final graphQLSwitch = GraphQLSwitch( clients: { 'client1': client1, 'client2': client2, }, defaultClientId: 'client1', // 设置默认客户端 );
-
切换客户端
你可以通过
switchClient
方法来切换客户端:graphQLSwitch.switchClient('client2');
-
使用当前客户端
你可以通过
currentClient
属性来获取当前使用的客户端:final currentClient = graphQLSwitch.currentClient;
-
执行 GraphQL 查询
使用当前客户端执行 GraphQL 查询或变更:
final query = ''' query { exampleQuery { field } } '''; final result = await currentClient.query(QueryOptions( document: gql(query), )); if (result.hasException) { print(result.exception); } else { print(result.data); }
示例
以下是一个完整的示例,展示了如何使用 graphql_switch
来切换不同的 GraphQL 客户端:
import 'package:flutter/material.dart';
import 'package:graphql_switch/graphql_switch.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'GraphQL Switch Demo',
home: GraphQLSwitchDemo(),
);
}
}
class GraphQLSwitchDemo extends StatefulWidget {
[@override](/user/override)
_GraphQLSwitchDemoState createState() => _GraphQLSwitchDemoState();
}
class _GraphQLSwitchDemoState extends State<GraphQLSwitchDemo> {
final graphQLSwitch = GraphQLSwitch(
clients: {
'client1': GraphQLClient(
cache: GraphQLCache(),
link: HttpLink('https://api1.example.com/graphql'),
),
'client2': GraphQLClient(
cache: GraphQLCache(),
link: HttpLink('https://api2.example.com/graphql'),
),
},
defaultClientId: 'client1',
);
String? selectedClientId = 'client1';
Future<void> _fetchData() async {
final query = '''
query {
exampleQuery {
field
}
}
''';
final result = await graphQLSwitch.currentClient.query(QueryOptions(
document: gql(query),
));
if (result.hasException) {
print(result.exception);
} else {
print(result.data);
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GraphQL Switch Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
DropdownButton<String>(
value: selectedClientId,
onChanged: (String? newValue) {
setState(() {
selectedClientId = newValue;
graphQLSwitch.switchClient(newValue!);
});
},
items: <String>['client1', 'client2']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _fetchData,
child: Text('Fetch Data'),
),
],
),
),
);
}
}