Flutter数据库连接插件hasura_connect的使用
Flutter数据库连接插件hasura_connect的使用
关于项目
hasura_connect
是一个用于简化 Flutter 应用程序与 Hasura 集成的插件。它利用了 GraphQL 的强大功能,使得在 Flutter 中进行数据查询、变更和订阅变得非常简单。
赞助商
入门指南
安装
要安装 hasura_connect
,您可以按照以下步骤操作:
方法一:在 pubspec.yaml
文件中添加依赖
dependencies:
hasura_connect: ^latest_version
方法二:使用 Slidy
slidy install hasura_connect
使用示例
简单使用示例
-
导入库
import 'package:hasura_connect/hasura_connect.dart';
-
初始化 HasuraConnect 实例
String url = 'http://localhost:8080/v1/graphql'; HasuraConnect hasuraConnect = HasuraConnect(url);
-
创建查询文档
String docQuery = """ query { authors { id email name } } """;
-
执行查询
var result = await hasuraConnect.query(docQuery); var listAuthors = (result['data']['authors'] as List).map((e) => Author.fromMap(e)).toList();
变更(Mutation)
-
创建变更文档
String docMutation = r""" mutation addProduto($nome: String, $categoria: uuid, $tipo: uuid, $valor: float8) { insert_produto(objects: {nome: $nome, categoria_produto_id: $categoria, tipo_produto_id: $tipo, valor: $valor}) { affected_rows } } """;
-
执行变更
var snapshot = await hasuraConnect.mutation(docMutation, variables: { "nome": "新商品", "categoria": "uuid_of_category", "tipo": "uuid_of_type", "valor": 100.0 });
订阅(Subscription)
-
创建订阅文档
String docSubscription = """ subscription getProdutos { produto { id nome valor tipo_produto { descricao } categoria_produto { descricao } } } """;
-
执行订阅
var snapshot = await hasuraConnect.subscription(docSubscription); var stream = snapshot.map((data) { return ProdutoModel.fromJsonList(data["data"]["produto"]) ?? []; }); stream.listen((produtos) { print(produtos); }).onError((error) { print(error); });
使用变量
-
创建带有变量的订阅文档
String docSubscription = """ subscription algumaCoisa($limit: Int!) { users(limit: $limit, order_by: {user_id: desc}) { id email name } } """;
-
执行订阅并传递变量
var snapshot = await hasuraConnect.subscription(docSubscription, variables: {"limit": 10}); // 更改变量值以实现分页 snapshot.changeVariable({"limit": 20});
拦截器
拦截器可以用于控制请求的流程,例如日志记录或缓存。社区已经提供了一些缓存拦截器包。
示例拦截器
class TokenInterceptor extends Interceptor {
final FirebaseAuth auth;
TokenInterceptor(this.auth);
@override
Future<Request> onRequest(Request request) async {
var user = await auth.currentUser();
var token = await user.getIdToken(refresh: true);
if (token != null) {
try {
request.headers["Authorization"] = "Bearer ${token.token}";
return request;
} catch (e) {
return null;
}
} else {
Modular.to.pushReplacementNamed("/login");
}
}
}
使用缓存拦截器
-
内存缓存
import 'package:hasura_cache_interceptor/hasura_hive_cache_interceptor.dart'; final storage = MemoryStorageService(); final cacheInterceptor = CacheInterceptor(storage); final hasura = HasuraConnect( "<your hasura url>", interceptors: [cacheInterceptor], httpClient: httpClient, );
-
Hive 缓存
import 'package:hasura_connect/hasura_connect.dart'; import 'package:hasura_hive_cache_interceptor/hasura_hive_cache_interceptor.dart'; final cacheInterceptor = HiveCacheInterceptor("<your box name> (optional)"); final hasura = HasuraConnect( "<your hasura url>", interceptors: [cacheInterceptor], httpClient: httpClient, );
-
SharedPreferences 缓存
import 'package:hasura_connect/hasura_connect.dart'; import 'package:shared_preferences_cache_interceptor/shared_preferences_cache_interceptor.dart'; final cacheInterceptor = SharedPreferencesCacheInterceptor(); final hasura = HasuraConnect( "<your hasura url>", interceptors: [cacheInterceptor], httpClient: httpClient, );
释放资源
HasuraConnect
提供了一个 dispose()
方法,可以在 Provider
或 BlocProvider
中使用。订阅只有在有人监听时才会启动,当所有监听者关闭时,HasuraConnect
会自动断开连接。
@override
void dispose() {
hasuraConnect.dispose();
super.dispose();
}
功能列表
- ✅ 查询
- ✅ 变更
- ✅ 订阅
- ✅ 在订阅中更改变量
- ✅ 自动重连
- ✅ 动态 JWT 令牌
- ✅ bloc_pattern 集成
- ✅ Provider 集成
- ✅ 变量
- ✅ 订阅缓存
- ✅ 变更缓存
- ✅ 查询缓存
贡献
如果您有任何建议或发现需要报告的问题,请参阅 贡献指南。
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature
) - 提交更改 (
git commit -m 'Add some AmazingFeature'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 打开 Pull Request
许可证
本项目采用 MIT 许可证,详情请参见 LICENSE.txt。
联系方式
维护者
由 Flutterando 构建和维护。
希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时联系我。
更多关于Flutter数据库连接插件hasura_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库连接插件hasura_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用hasura_connect
插件进行数据库连接的示例代码。这个插件允许你与Hasura GraphQL引擎进行交互,从而实现对PostgreSQL数据库的CRUD操作。
首先,确保你已经在pubspec.yaml
文件中添加了hasura_connect
依赖:
dependencies:
flutter:
sdk: flutter
hasura_connect: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来,我们创建一个简单的Flutter应用来演示如何使用hasura_connect
。
1. 初始化Hasura Connect
在你的Flutter应用的入口文件(通常是main.dart
)中,初始化Hasura Connect客户端:
import 'package:flutter/material.dart';
import 'package:hasura_connect/hasura_connect.dart';
void main() {
// 初始化Hasura Connect客户端
final hasura = HasuraConnect(
endpoint: 'https://你的Hasura GraphQL端点', // 替换为你的Hasura GraphQL端点
adminSecret: '你的admin密钥', // 如果需要管理权限,提供admin密钥(可选)
headers: {
'x-hasura-admin-secret': '你的admin密钥', // 或者在headers中提供
// 其他需要的header,比如Authorization等
},
);
runApp(MyApp(hasura: hasura));
}
class MyApp extends StatelessWidget {
final HasuraConnect hasura;
MyApp({required this.hasura});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Hasura Connect Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(hasura: hasura),
);
}
}
2. 创建一个页面来执行数据库操作
接下来,我们创建一个页面MyHomePage
,在其中执行一个简单的查询操作:
import 'package:flutter/material.dart';
import 'package:hasura_connect/hasura_connect.dart';
class MyHomePage extends StatefulWidget {
final HasuraConnect hasura;
MyHomePage({required this.hasura});
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late String result;
@override
void initState() {
super.initState();
_fetchData();
}
Future<void> _fetchData() async {
try {
// 执行一个GraphQL查询
final query = '''
query {
users {
id
name
}
}
''';
final response = await widget.hasura.query(query: query);
setState(() {
result = response.data!['users'].map((user) => '${user['id']}: ${user['name']}').join('\n');
});
} catch (e) {
setState(() {
result = 'Error: ${e.message}';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Hasura Connect Demo'),
),
body: Center(
child: Text(result),
),
);
}
}
3. 运行应用
确保你的Hasura GraphQL端点和admin密钥是正确的,然后运行你的Flutter应用。你应该会看到一个页面,上面列出了从Hasura GraphQL端点获取的用户数据。
注意事项
- 安全性:在生产环境中,不要在客户端代码中硬编码admin密钥。考虑使用更安全的方法来传递这些敏感信息,比如环境变量或安全的API密钥管理服务。
- 错误处理:上面的示例中只简单地捕获了异常并显示了错误消息。在实际应用中,你可能需要更复杂的错误处理逻辑。
- 性能:对于大型数据集,考虑使用分页或懒加载来优化性能。
这个示例展示了如何使用hasura_connect
插件在Flutter应用中与Hasura GraphQL引擎进行交互。根据你的具体需求,你可以扩展这个示例来实现更多的功能,比如插入、更新和删除操作。