Flutter数据库连接插件hasura_connect的使用

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

Flutter数据库连接插件hasura_connect的使用

关于项目

hasura_connect 是一个用于简化 Flutter 应用程序与 Hasura 集成的插件。它利用了 GraphQL 的强大功能,使得在 Flutter 中进行数据查询、变更和订阅变得非常简单。

赞助商

Logo

入门指南

安装

要安装 hasura_connect,您可以按照以下步骤操作:

方法一:在 pubspec.yaml 文件中添加依赖

dependencies:
  hasura_connect: ^latest_version

方法二:使用 Slidy

slidy install hasura_connect

使用示例

简单使用示例

  1. 导入库

    import 'package:hasura_connect/hasura_connect.dart';
    
  2. 初始化 HasuraConnect 实例

    String url = 'http://localhost:8080/v1/graphql';
    HasuraConnect hasuraConnect = HasuraConnect(url);
    
  3. 创建查询文档

    String docQuery = """
    query {
      authors {
        id
        email
        name
      }
    }
    """;
    
  4. 执行查询

    var result = await hasuraConnect.query(docQuery);
    var listAuthors = (result['data']['authors'] as List).map((e) => Author.fromMap(e)).toList();
    

变更(Mutation)

  1. 创建变更文档

    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
      }
    }
    """;
    
  2. 执行变更

    var snapshot = await hasuraConnect.mutation(docMutation, variables: {
      "nome": "新商品",
      "categoria": "uuid_of_category",
      "tipo": "uuid_of_type",
      "valor": 100.0
    });
    

订阅(Subscription)

  1. 创建订阅文档

    String docSubscription = """
    subscription getProdutos {
      produto {
        id
        nome
        valor
        tipo_produto {
          descricao
        }
        categoria_produto {
          descricao
        }
      }
    }
    """;
    
  2. 执行订阅

    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);
    });
    

使用变量

  1. 创建带有变量的订阅文档

    String docSubscription = """
    subscription algumaCoisa($limit: Int!) {
      users(limit: $limit, order_by: {user_id: desc}) {
        id
        email
        name
      }
    }
    """;
    
  2. 执行订阅并传递变量

    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");
    }
  }
}

使用缓存拦截器

  1. 内存缓存

    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,
    );
    
  2. 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,
    );
    
  3. 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() 方法,可以在 ProviderBlocProvider 中使用。订阅只有在有人监听时才会启动,当所有监听者关闭时,HasuraConnect 会自动断开连接。

@override
void dispose() {
  hasuraConnect.dispose();
  super.dispose();
}

功能列表

  • ✅ 查询
  • ✅ 变更
  • ✅ 订阅
  • ✅ 在订阅中更改变量
  • ✅ 自动重连
  • ✅ 动态 JWT 令牌
  • ✅ bloc_pattern 集成
  • ✅ Provider 集成
  • ✅ 变量
  • ✅ 订阅缓存
  • ✅ 变更缓存
  • ✅ 查询缓存

贡献

如果您有任何建议或发现需要报告的问题,请参阅 贡献指南

  1. Fork 项目
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

请记得包含标签,并遵循 常规提交语义化版本 规范。

许可证

本项目采用 MIT 许可证,详情请参见 LICENSE.txt

联系方式

维护者

Flutterando 构建和维护。

希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时联系我。


更多关于Flutter数据库连接插件hasura_connect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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端点获取的用户数据。

注意事项

  1. 安全性:在生产环境中,不要在客户端代码中硬编码admin密钥。考虑使用更安全的方法来传递这些敏感信息,比如环境变量或安全的API密钥管理服务。
  2. 错误处理:上面的示例中只简单地捕获了异常并显示了错误消息。在实际应用中,你可能需要更复杂的错误处理逻辑。
  3. 性能:对于大型数据集,考虑使用分页或懒加载来优化性能。

这个示例展示了如何使用hasura_connect插件在Flutter应用中与Hasura GraphQL引擎进行交互。根据你的具体需求,你可以扩展这个示例来实现更多的功能,比如插入、更新和删除操作。

回到顶部