Flutter训练日志插件traindown的使用

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

Flutter训练日志插件traindown的使用

Traindown 是一种帮助运动员表达其训练的语言。灵感来源于 Markdown。

这是 Traindown 语言规范版本 1.2.1 的 Dart 实现。更多详细信息,请访问 Traindown 官网。

示例代码

以下是 example/example.dart 文件中的示例代码:

import 'dart:io';

import 'package:traindown/src/presenters/console_presenter.dart';
import 'package:traindown/src/presenters/json_presenter.dart';
import 'package:traindown/src/formatter.dart';
import 'package:traindown/src/parser.dart';
import 'package:traindown/src/session.dart';

void main() {
  // 这是一个示例 Traindown 字符串,可以进行美化并传递给解析器进行解析。
  Parser parser = Parser(
      '@ 2019-10-21; # unit:lbs; Squat: 500 #rir:10; 550 2r; 600 3r 3s; * Was hard');

  // 解析结果是一个 Token 列表,我们可以将其传递给格式化器等工具。
  Formatter formatter = Formatter();

  // 让我们看看格式化器的功能!这里我们创建一个新的格式化器,使用默认输出选项。
  String formatted = formatter.format(parser.tokens());

  // 输出美化后的 Traindown
  print('Enjoy this formatted Traindown!\n');
  print(formatted);
  print('\n\n---\n\n');

  // 输出样例
  /*
    Enjoy this formatted Traindown!

    @ 2019-10-21

    # unit: lbs

    Squat:
      500
        # rir: 10
      550 2r
      600 3r 3s
        * Was hard
  */

  // 使用格式化器,您可以根据具体需求调整输出。这里我们打开一些呼吸空间。
  formatter.indenter = '    ';

  print('Very space. Much wow\n');
  print(formatter.format(parser.tokens()));
  print('\n\n---\n\n');

  // 输出样例
  /*
    Very space. Much wow

    @ 2019-10-21

    # unit: lbs

    Squat:
        500
            # rir: 10
        550 2r
        600 3r 3s
            * Was hard
  */

  // 一旦解析,我们通常希望对数据进行某种处理。这就是会话(Session)发挥作用的地方。让我们试一试。

  Session session = Session(parser.tokens());

  // 这是会话的默认 toString 方法。
  print(session);

  // 我们还有一系列预设的呈现器,也可以基于基类构建自己的呈现器!

  ConsolePresenter cp = ConsolePresenter(session);

  // 这里是我们使用文本呈现器的结果。

  print("An example of a text based presenter\n");
  print(cp.present());
  print('\n\n---\n\n');

  // 还有 JSON 可用。

  JsonPresenter jp = JsonPresenter(session);

  // 输出如下

  print("And here is some JSON\n");
  print(jp.present());
  print('\n\n---\n\n');

  // 您还可以轻松读取文件

  File file = File("./example/example.traindown");
  String src = file.readAsStringSync();
  Parser fileParser = Parser(src);
  Session fileSession = Session(fileParser.tokens());

  // 使用我们的方便的呈现器

  ConsolePresenter fcp = ConsolePresenter(fileSession);

  // 我们看到一些令人惊叹的东西!

  print("A longer example presented for the console\n");
  print(fcp.present());
  print('\n\n---\n\n');
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用traindown插件的示例代码。traindown是一个用于记录和追踪健身训练日志的Flutter插件。假设你已经在你的Flutter项目中添加了traindown依赖(通常在pubspec.yaml文件中)。

首先,确保你已经在pubspec.yaml文件中添加了依赖:

dependencies:
  flutter:
    sdk: flutter
  traindown: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我将展示一个简单的Flutter应用示例,该应用使用traindown插件来记录和显示训练日志。

main.dart

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

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

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

class TraindownExample extends StatefulWidget {
  @override
  _TraindownExampleState createState() => _TraindownExampleState();
}

class _TraindownExampleState extends State<TraindownExample> {
  final Traindown _traindown = Traindown();
  List<String> _logs = [];

  @override
  void initState() {
    super.initState();
    // 加载已有的训练日志(假设从本地存储或其他来源)
    _loadLogs();
  }

  Future<void> _loadLogs() async {
    // 这里假设你已经有方法从存储中获取日志列表
    // 例如,从本地文件、数据库等
    // 这里只是模拟一些日志数据
    setState(() {
      _logs = [
        "Squat: 3x5 @ 225lb",
        "Bench Press: 4x4 @ 185lb",
        "Deadlift: 5x1 @ 315lb",
      ];
    });
  }

  Future<void> _addLog(String log) async {
    // 假设这里将日志保存到本地存储或其他持久化存储中
    // 这里只是简单地将日志添加到列表中并刷新UI
    setState(() {
      _logs.add(log);
    });

    // 使用traindown的格式解析和存储日志(这里仅作为示例,实际存储逻辑可能不同)
    // Traindown格式通常较为简单,但你可能需要根据具体需求调整
    final parsedLog = TraindownParser().parse(log);
    // 这里可以添加将parsedLog保存到数据库或文件的代码
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Traindown Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Training Logs:', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
            SizedBox(height: 16),
            Expanded(
              child: ListView.builder(
                itemCount: _logs.length,
                itemBuilder: (context, index) {
                  return Card(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(_logs[index]),
                    ),
                  );
                },
              ),
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(labelText: 'Add Log'),
              onEditingComplete: () {
                final log = _textController.text;
                if (log.isNotEmpty) {
                  _addLog(log);
                  _textController.clear();
                }
              },
              controller: _textController,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          final log = _textController.text;
          if (log.isNotEmpty) {
            _addLog(log);
            _textController.clear();
            _scrollController.animateTo(
              _scrollController.position.maxScrollExtent,
              duration: const Duration(milliseconds: 300),
              curve: Curves.easeOut,
            );
          }
        },
        tooltip: 'Add Log',
        child: Icon(Icons.add),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
    );
  }

  final TextEditingController _textController = TextEditingController();
  final ScrollController _scrollController = ScrollController();

  @override
  void dispose() {
    _textController.dispose();
    _scrollController.dispose();
    super.dispose();
  }
}

说明

  1. 依赖添加:确保在pubspec.yaml中添加了traindown依赖。
  2. 初始化:在initState方法中,加载已有的训练日志(此处为模拟数据)。
  3. 日志添加:提供了一个文本字段用于输入新的训练日志,点击浮动按钮或完成文本编辑时会将日志添加到列表中。
  4. UI显示:使用ListView.builder来显示训练日志列表。
  5. 解析与存储:虽然示例中仅将日志添加到内存中的列表,但你可以根据需要使用TraindownParser来解析日志,并将其保存到数据库或文件中。

请注意,这个示例并未实际使用traindown插件提供的所有功能,而是展示了如何结合Flutter的基本组件来记录和显示训练日志。你可能需要根据实际需求进一步调整和扩展代码。

回到顶部