Flutterpumli 是一个用于 Dart 的 PlantUML 接口插件pumli的使用

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 Flutter

Flutterpumli 是一个用于 Dart 的 PlantUML 接口插件pumli的使用

插件介绍

pumli 是一个用于 Dart 的 PlantUML 接口插件。它允许将 PlantUML 文本格式的图表转换为各种输出格式(如 SVG 和 PNG),并直接从 Dart 进行操作。该插件已经测试在 Ubuntu 20.04LTS 上,但预计在其他操作系统上也能正常工作。

特性

  • Dart API:提供字符串形式的 PlantUML 图表到各种输出格式(目前支持 SVG 和 PNG)的转换。
    • PumliCmd 使用 PlantUML 命令行 API 进行转换。
    • PumliREST 使用 Web API 进行转换。
  • PumliServer:启动 Picoweb 服务的 PlantUML:
    • 在 Picoweb 模式下启动植物 UML 命令(需要预先安装作为先决条件)。
    • 在 Picoweb 模式下启动带有给定参数的 Java(如果已安装 PlantUML jar)。

示例代码

import 'dart:io';

import 'package:pumli/pumli.dart';
import 'package:pumli/src/assistance.dart';

import 'constants.dart';

const model = complexModel;

final _log = getLogger('pumli_example');

Future<void> main() async {
  initLogging();
  _log.info('Starting Pumli server.');

  // 使用公共的 PlantUML 服务 www.plantuml.com
  // 根据其服务条款和安全预期进行使用
  final pumliREST = PumliREST(serviceURL: PumliREST.plantUmlUrl);
  final stopwatch = Stopwatch()..start();

  // 需要预先安装 plantuml 并且服务器运行: $plantuml -picoweb
  // final pumliREST = PumliREST(server: 'http://127.0.0.1:8080');

  stopwatch.reset();
  _log.info('PumliREST - Converting model to PNG.');
  final buffer = await pumliREST.getPNG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_rest.png').writeAsBytes(buffer);

  stopwatch.reset();
  _log.info('PumliREST - Converting model to SVG.');
  final svg1 = await pumliREST.getSVG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_rest.svg').writeAsString(svg1);

  _log.info('Creating PumliCmd.');
  final pumliCmd1 = PumliCmd();

  stopwatch.reset();
  _log.info('PumliCmd - Converting model to PNG.');
  final buffer2 = await pumliCmd1.getPNG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_cmd_plantuml.png').writeAsBytes(buffer2);

  stopwatch.reset();
  _log.info('PumliCmd - Converting model to SVG.');
  final svg2 = await pumliCmd1.getSVG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_cmd_plantuml.svg').writeAsString(svg);

  _log.info('Creating PumliCmdJar.');
  final pumliCmdJar = PumliCmd(jar: jarPath);

  stopwatch.reset();
  _log.info('PumliCmdJar - Converting model to PNG.');
  final buffer3 = await pumliCmdJar.getPNG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_cmd_jar.png').writeAsBytes(buffer3);

  stopwatch.reset();
  _log.info('PumliCmdJar - Converting model to SVG.');
  final svg3 = await pumliCmdJar.getSVG(model);
  _log.info('Elapse: ${stopwatch.elapsed}');
  await File('${outPrefix}_cmd_jar.svg').writeAsString(svg3);
}

使用说明

  1. 使用公共 PlantUML 渲染服务

    const simpleModel = '''
    [@startuml](/user/startuml)
    start
    :Hello Pumli user!;
    stop
    [@enduml](/user/enduml)
    ''';
    
    final svg = await PumliREST(serviceURL: PumliREST.plantUmlUrl).getSVG(simpleModel);
    
  2. 使用 PlantUML 命令行 API

    final pumliCmd = PumliCmd();
    final svg2 = await pumliCmd.getSVG(model);
    
  3. 启动本地 PlantUML picoweb 渲染器

    final pumliServer = PumliServer();
    await pumliServer.start();
    
  4. 获取生成的 SVG 文件

    final svg = await pumliREST.getSVG(model);
    await File('/tmp/simple_rest.svg').writeAsString(svg);
    
  5. 注意事项

    • 使用 raw string 以处理包含转义字符如 \n 的的模型:
      const rawString = r'demo\n';

更多关于Flutterpumli 是一个用于 Dart 的 PlantUML 接口插件pumli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutterpumli 是一个用于 Dart 的 PlantUML 接口插件pumli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


关于Flutter中未知功能插件pumli(需要注意,pumli并不是一个广为人知的Flutter插件,可能是一个假设的或者特定项目中的插件名称,这里我将基于一个假设的插件功能进行说明),虽然无法提供确切的官方文档或广泛认可的用法,但我可以根据一般的Flutter插件使用方式给出一个探索性的代码案例。

通常,Flutter插件的使用涉及以下几个步骤:

  1. pubspec.yaml文件中添加依赖: 假设pumli插件已经发布在pub.dev上(实际上并不存在,这里仅为示例),你可以这样添加依赖:

    dependencies:
      flutter:
        sdk: flutter
      pumli: ^x.y.z  # 假设的版本号
    

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

  2. 导入插件: 在你的Dart文件中导入该插件:

    import 'package:pumli/pumli.dart';
    
  3. 使用插件的功能: 由于pumli的具体功能未知,我将假设它提供了一些基本的UI组件或服务。以下是一个假设性的代码示例,展示如何使用这个插件(这里的代码完全是虚构的,仅用于说明):

    import 'package:flutter/material.dart';
    import 'package:pumli/pumli.dart';  // 导入假设的pumli插件
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Pumli Plugin Demo'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                // 假设PumliButton是pumli插件提供的一个按钮组件
                PumliButton(
                  label: 'Click Me',
                  onPressed: () {
                    // 假设PumliService是pumli插件提供的一个服务类
                    PumliService.doSomething().then((result) {
                      // 处理服务返回的结果
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(content: Text('Result: $result')),
                      );
                    });
                  },
                ),
              ],
            ),
          ),
        );
      }
    }
    
    // 假设的PumliService类及其静态方法(实际上并不存在,仅用于说明)
    class PumliService {
      static Future<String> doSomething() async {
        // 模拟异步操作,例如网络请求或数据处理
        await Future.delayed(Duration(seconds: 2));
        return 'Operation Completed';
      }
    }
    
    // 注意:下面的PumliButton类是一个假设的组件定义,实际上并不存在
    // 如果你使用的是真实的pumli插件,这里应该被替换为插件实际提供的组件
    class PumliButton extends StatelessWidget {
      final String label;
      final VoidCallback onPressed;
    
      PumliButton({required this.label, required this.onPressed});
    
      @override
      Widget build(BuildContext context) {
        return ElevatedButton(
          onPressed: onPressed,
          child: Text(label),
        );
      }
    }
    

请注意,上述代码中的PumliButtonPumliService是假设性的,用于演示如何在Flutter中使用一个假想的插件。在实际开发中,你需要参考pumli插件的真实文档和API来了解其提供的功能和组件,并按照文档进行使用。

由于pumli并不是一个真实存在的插件,因此上述代码仅作为探索Flutter插件使用方式的一个示例。如果你确实有一个名为pumli的插件,并且需要具体的使用指导,建议查阅该插件的官方文档或源代码以获取准确的信息。

回到顶部