Flutter插件sparky的使用方法

Flutter插件Sparky的使用方法

欢迎使用Sparky

Sparky是一个帮助简化REST API构建的Dart包,支持WebSocket和JWT认证。以下是Sparky的主要特性:

  • 自动缓存:在路由中自动缓存响应。
  • 日志系统:记录API请求和响应的日志。
  • WebSocket支持:可以轻松创建WebSocket路由。
  • JWT认证:提供简单的JWT生成和验证功能。
  • 中间件管道:可以在主中间件执行前后添加多个中间件。

如何使用Flutter插件Sparky

创建一个简单的路由

你可以使用自定义构造函数来创建只接受GET方法的路由,或者使用默认构造函数并进行个性化设置。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  // 创建一个GET路由,返回“Olá mundo”
  final route1 = RouteHttp.get('/teste', middleware: (request) async {
    return Response.ok(body: 'Olá mundo');
  });

  // 初始化Sparky并传递路由列表
  Sparky.server(routes: [route1]);
}
从类创建路由

通过继承Route类,你可以定义更复杂的路由逻辑,例如是否为WebSocket路由、接受哪些HTTP方法等。

import 'dart:io';
import 'package:sparky/sparky.dart';

final class RouteTest extends Route {
  RouteTest()
      : super('/test', middleware: (request) async {
          return Response.ok(body: 'test');
        }, acceptedMethods: [
          AcceptedMethods.get,
          AcceptedMethods.post,
        ]);
}

final class RouteSocket extends Route {
  RouteSocket()
      : super('/socket', middlewareWebSocket: (WebSocket webSocket) async {
          webSocket.listen((event) {
            print(event);
          }, onDone: () {
            webSocket.close();
          });
        });
}

void main() {
  // 初始化Sparky并传递路由列表
  Sparky.server(routes: [RouteTest(), RouteSocket()]);
}
自定义IP和端口

你可以通过传递ipport参数来自定义服务器的绑定地址和端口。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  Sparky.server(
    routes: [...],
    ip: '0.0.0.0',
    port: 8080,
  );
}
创建Pipeline

你可以添加多个中间件到Pipeline中,在路由执行前后执行这些中间件。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  Sparky.server(
    routes: [...],
    pipelineAfter: Pipeline()
      ..add((request) async => null)
      ..add((request) async => null),
    pipelineBefore: Pipeline()
      ..add((request) async {
        // 在这里添加逻辑
      }),
  );
}
日志系统

你可以配置日志系统,选择显示或写入日志文件。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  Sparky.server(
    routes: [...],
    logConfig: LogConfig.showAndWriteLogs,
    logType: LogType.all,
  );
}
使用WebSocket

WebSocket路由与其他路由类似,但需要处理WebSocket连接。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  final websocket = RouteWebSocket(
    '/test',
    middlewareWebSocket: (WebSocket socket) async {
      socket.add('Hello World');
      socket.listen(
        (event) {
          print(event);
        },
        onDone: () {
          socket.close();
        },
      );
    },
  );

  Sparky.server(
    routes: [websocket],
  );
}
简单的JWT登录

生成JWT并在每个请求前验证它。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  final authJwt = AuthJwt(secretKey: 'secretKey');

  final login = RouteHttp.get('/login', middleware: (HttpRequest request) async {
    final token = authJwt.generateToken({'username': 'username'});
    return Response.ok(body: '{"token":"$token"}');
  });

  Sparky.server(
    routes: [login],
    pipelineBefore: Pipeline()
      ..add((HttpRequest request) async {
        if (request.requestedUri.path == '/login') {
          return null;
        } else {
          if (request.headers['token'] != null) {
            if (request.headers['token'] != null &&
                authJwt.verifyToken(request.headers['token']!.first)) {
              return null;
            } else {
              return Response.unauthorized(body: 'Não autorizado');
            }
          } else {
            return Response.unauthorized(body: 'Envie o token no header');
          }
        }
      }),
  );
}
编译以获得最佳性能

使用以下命令将Dart代码编译为可执行文件,以获得更好的性能。

dart compile exe main.dart
缓存机制

默认情况下,路由会自动缓存响应。如果你想绕过缓存,可以调用onUpdate方法。

import 'dart:io';
import 'package:sparky/sparky.dart';

void main() {
  final random = RouteHttp.get('/random', middleware: (HttpRequest request) async {
    final value = Random().nextInt(100);
    return Response.ok(body: '{value:$value}');
  });

  Sparky.server(
    routes: [random],
    pipelineBefore: Pipeline()
      ..add((HttpRequest request) async {
        random.onUpdate();
      }),
  );
}

示例代码

以下是一个完整的示例代码,展示了如何使用Sparky创建路由、处理JWT认证、使用WebSocket以及配置Pipeline。

// [@author](/user/author) viniciusddrft

import 'dart:io';
import 'dart:math';
import 'package:sparky/sparky.dart';

void main() {
  /// 在这个示例代码中,我将演示如何使用继承自Route的自定义类
  /// 或直接使用RouteHttp和RouteWebSocket类来创建路由。
  /// 示例还展示了JWT登录和Pipeline系统的使用。

  final authJwt = AuthJwt(secretKey: 'senha');

  final login =
      RouteHttp.get('/login', middleware: (HttpRequest request) async {
    final token = authJwt.generateToken({'username': 'username'});

    return Response.ok(body: '{"token":"$token"}');
  });

  final todo =
      RouteHttp.get('/todo/list', middleware: (HttpRequest request) async {
    return Response.ok(body: '[0,1,2,3,4,5,6,7,8,9]');
  });

  final random =
      RouteHttp.get('/random', middleware: (HttpRequest request) async {
    final value = Random().nextInt(100);
    return Response.ok(body: '{value:$value}');
  });

  final web = RouteWebSocket(
    '/websocket',
    middlewareWebSocket: (WebSocket socket) async {
      socket.add('Hello Word');
      socket.listen(
        (event) {
          print(event);
        },
        onDone: () {
          socket.close();
        },
      );
    },
  );

  Sparky.server(
      routes: [
        login,
        todo,
        web,
        random,
        RouteTest(),
        RouteSocket(),
      ],
      pipelineBefore: Pipeline()
        ..add((HttpRequest request) async {
          if (request.requestedUri.path == '/login') {
            return null;
          } else {
            if (request.headers['token'] != null) {
              if (request.headers['token'] != null &&
                  authJwt.verifyToken(request.headers['token']!.first)) {
                random.onUpdate();
                return null;
              } else {
                return Response.unauthorized(body: 'Não autorizado');
              }
            } else {
              return Response.unauthorized(body: 'Envie o token no header');
            }
          }
        }),
      pipelineAfter: Pipeline()
        ..add((request) async {
          print('pipeline after 1 done');
          return null;
        })
        ..add((request) async {
          print('pipeline after 2 done');
          return null;
        }));
}

/// 通过类创建路由

final class RouteTest extends Route {
  RouteTest()
      : super('/test', middleware: (request) async {
          return Response.ok(body: 'test');
        }, acceptedMethods: [
          AcceptedMethods.get,
          AcceptedMethods.post,
        ]);
}

final class RouteSocket extends Route {
  RouteSocket()
      : super('/socket', middlewareWebSocket: (WebSocket webSocket) async {
          webSocket.listen((event) {
            print(event);
          }, onDone: () {
            webSocket.close();
          });
        });
}

更多关于Flutter插件sparky的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


关于Flutter中未知插件sparky的使用,由于sparky并非一个广为人知的官方或广泛使用的插件,因此我无法提供确切的文档或广泛认可的用法指南。不过,假设sparky是一个自定义的或特定项目中的插件,并且你已经有了这个插件的依赖项和基本的集成方式,下面是一个通用的方法来尝试集成和使用一个Flutter插件的示例代码框架。

1. 添加依赖项

首先,你需要在pubspec.yaml文件中添加sparky作为依赖项(假设它已经在pub.dev上发布或者你已经通过其他方式获取了它的源代码)。

dependencies:
  flutter:
    sdk: flutter
  sparky: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来获取依赖项。

2. 导入插件

在你的Dart文件中导入sparky插件。

import 'package:sparky/sparky.dart';

3. 使用插件

由于sparky的具体API和功能未知,这里我将提供一个假设性的使用示例。假设sparky提供了一个名为Spark的类,该类有一个名为ignite的方法。

import 'package:flutter/material.dart';
import 'package:sparky/sparky.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sparky Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String result = '';

  @override
  void initState() {
    super.initState();
    // 假设 Spark 类有一个 ignite 方法,该方法返回一个 Future<String>
    useSparky();
  }

  Future<void> useSparky() async {
    try {
      Spark spark = Spark();
      String resultFromSpark = await spark.ignite();
      setState(() {
        result = resultFromSpark;
      });
    } catch (e) {
      print('Error using Sparky: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sparky Demo'),
      ),
      body: Center(
        child: Text('Result from Sparky: $result'),
      ),
    );
  }
}

// 假设的 Spark 类定义(实际使用时,应根据插件提供的文档进行修改)
class Spark {
  Future<String> ignite() async {
    // 模拟一个异步操作,比如网络请求或计算
    await Future.delayed(Duration(seconds: 2));
    return 'Spark ignited!';
  }
}

注意:上面的Spark类是一个假设性的实现,仅用于展示如何使用一个假设的插件方法。在实际使用中,你应该根据sparky插件提供的真实API文档来编写代码。

4. 运行应用

确保你的开发环境已经正确设置,然后运行你的Flutter应用:

flutter run

结论

由于sparky是一个未知的插件,上述代码提供了一个基本的框架来展示如何集成和使用一个Flutter插件。然而,为了获得准确的使用指南和API文档,你应该查阅sparky插件的官方文档或源代码。如果sparky是一个私有或内部插件,你可能需要联系插件的开发者或维护者以获取更多信息。

回到顶部