Flutter数据交互插件shelf_hasura_actions的使用

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

Flutter数据交互插件shelf_hasura_actions的使用

shelf_hasura_actions 是一个用于处理 Hasura Action 的中间件。它可以帮助你在 Hasura GraphQL 服务器上定义和处理自定义操作。

使用 Action

以下是一个简单的使用示例:

import 'package:shelf_hasura_actions/shelf_hasura_actions.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'calculate_usebmi_function.dart' as bmi;

void main() async {
  // 获取处理器
  final hasuraHandler = hasuraActions(_actions);

  // 将其放入shelf管道中
  var server = await io.serve(hasuraHandler, 'localhost', 8080);
  print('Serving at http://${server.address.host}:${server.port}');
}

// 我的操作列表
const _actions = <String, BindCallbackAction>{
  'bmiAction': bmi.calculateUseBmi,
};

Action 函数示例

import 'package:shelf_hasura_actions/src/hasura_request.dart';
import 'package:shelf/shelf.dart';

Future<Response> calculateUseBmi(ActionRequest action) async {
  return Response.ok('{"result": "ok"}'); // 返回成功的响应
}

使用 Trigger

以下是一个简单的触发器使用示例:

import 'package:shelf_hasura_actions/shelf_hasura_actions.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'calculate_usebmi_function.dart' as bmi;

void main() async {
  // 获取处理器
  final hasuraHandler = hasuraTrigger(_actions);

  // 将其放入shelf管道中
  var server = await io.serve(hasuraHandler, 'localhost', 8080);
  print('Serving at http://${server.address.host}:${server.port}');
}

// 我的操作列表
const _actions = <String, BindCallbackTrigger>{
  'bmiAction': bmi.calculateUseBmi,
};

触发函数示例

import 'package:shelf_hasura_actions/src/hasura_request.dart';
import 'package:shelf/shelf.dart';

Future<Response> calculateUseBmi(TriggerRequest action) async {
  return Response.ok('{"result": "ok"}'); // 返回成功的响应
}

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

1 回复

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


在Flutter应用中,通过shelf_hasura_actions插件可以实现与Hasura GraphQL引擎的数据交互。这个插件通常用于在后端服务(如使用Dart语言编写的Shelf服务器)中处理GraphQL请求,并将结果返回给Flutter前端。

以下是一个简单的示例,展示了如何使用shelf_hasura_actions在Dart后端处理GraphQL请求,并在Flutter前端发送这些请求。

后端(Dart/Shelf)

首先,确保你在pubspec.yaml文件中添加了必要的依赖项:

dependencies:
  shelf: ^1.0.0
  shelf_router: ^1.0.0
  shelf_hasura_actions: ^x.y.z # 请替换为最新版本号
  http: ^0.13.0

然后,创建一个Shelf服务器来处理GraphQL请求:

import 'dart:convert';
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_hasura_actions/shelf_hasura_actions.dart';
import 'package:http/http.dart' as http;

void main() {
  var router = Router();

  // 配置Hasura GraphQL端点和管理员密钥
  var hasuraEndpoint = 'https://your-hasura-endpoint.com/v1/graphql';
  var adminSecret = 'your-admin-secret';

  // 创建一个HasuraActions实例
  var hasuraActions = HasuraActions(
    endpoint: hasuraEndpoint,
    adminSecret: adminSecret,
    httpClient: http.Client(),
  );

  // 定义一个处理GraphQL请求的处理器
  router.post('/graphql', (Request request) async {
    var body = await request.readAsString();
    var requestData = jsonDecode(body) as Map<String, dynamic>;

    try {
      var responseData = await hasuraActions.handleRequest(requestData);
      return Response.ok(jsonEncode(responseData), headers: {
        'Content-Type': 'application/json',
      });
    } catch (e) {
      return Response.internalServerError(body: jsonEncode({
        'error': e.toString(),
      }));
    }
  });

  var handler = router.handler;

  var server = await shelfListenAndServe(
    address: 'localhost',
    port: 8080,
    handler: handler,
  );

  print('Serving at http://${server.address.host}:${server.port}');
}

前端(Flutter)

在Flutter前端,你可以使用http包来发送GraphQL请求到你的Shelf服务器。

首先,在pubspec.yaml文件中添加http依赖项:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.0

然后,创建一个函数来发送GraphQL请求:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _responseData = '';

  Future<void> _sendGraphQLRequest() async {
    var url = 'http://localhost:8080/graphql';
    var graphQLQuery = '''
      query {
        users {
          id
          name
        }
      }
    ''';

    var body = jsonEncode({
      'query': graphQLQuery,
    });

    var response = await http.post(
      Uri.parse(url),
      body: body,
      headers: {
        'Content-Type': 'application/json',
      },
    );

    if (response.statusCode == 200) {
      setState(() {
        _responseData = jsonDecode(response.body)['data']?.toString() ?? '';
      });
    } else {
      setState(() {
        _responseData = 'Error: ${response.statusCode}\n${response.body}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Hasura Actions Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Response Data:'),
              Text(_responseData),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _sendGraphQLRequest,
                child: Text('Send GraphQL Request'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个Flutter应用包含一个按钮,点击后会向你的Shelf服务器发送一个GraphQL请求,并在屏幕上显示响应数据。

请注意,这只是一个基本示例,实际项目中你可能需要处理更多的错误情况、添加认证机制、优化性能等。

回到顶部