Flutter微型框架插件tiny_frame的使用

Flutter微型框架插件tiny_frame的使用

TinyFrame 是一个简单的库,用于构建和解析通过串行接口(如 UART、telnet、socket)发送的数据帧。它是由 C 库 TinyFrame 转换而来,并通过自动化工具从 Python 转换为 Dart 语言,进行了少量修改。

特性

TinyFrame 是一个简单库,用于构建和解析数据帧以通过串行接口(例如 UART、telnet、socket)发送。

使用方法

以下是一个使用 TinyFrame 的完整示例:

import 'dart:typed_data';
import 'package:tiny_frame/tiny_frame.dart';

void main() {
  const typeID = 1;

  // 创建一个带有写入函数的 TinyFrame 实例
  // 在 C 库中为 TF_WriteImpl
  final tf = TinyFrame((Uint8List data) => print('write: $data'));

  // 设置一些可选参数
  tf.cksumType = 'xor'; // 设置校验类型为 XOR

  // 为类型 ID 1 添加监听器
  tf.addTypeListener(typeID, (_, TF_Msg msg) => print('main: $msg'));

  // 如果未找到类型 ID 的监听器,则调用此回退监听器
  tf.addFallbackListener((_, TF_Msg msg) => print('fallback: $msg'));

  // 向类型 ID 1 发送数据
  tf.send(typeID, Uint8List.fromList('abcde'.codeUnits));
}

数据帧结构

数据帧结构如下所示:

,-----+-----+-----+------+------------+- - - -+-------------,
| SOF | ID  | LEN | TYPE | HEAD_CKSUM | DATA  | DATA_CKSUM  |
| 0-1 | 1-4 | 1-4 | 1-4  | 0-4        | ...   | 0-4         | <- size (bytes)
'-----+-----+-----+------+------------+- - - -+-------------'

SOF ......... 开始帧标志,通常为 0x01(可选,可配置)
ID  ......... 帧 ID(最高位是对等位)
LEN ......... 帧中数据字节数
TYPE ........ 消息类型(用于运行类型监听器,选择你喜欢的任何值)
HEAD_CKSUM .. 头部校验和

DATA ........ LEN 字节的数据
DATA_CKSUM .. 数据校验和(如果 LEN 为 0 则省略)

更多关于Flutter微型框架插件tiny_frame的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


tiny_frame 是一个用于 Flutter 的微型框架插件,旨在帮助开发者更轻松地处理和管理 Flutter 应用中的状态和路由。它提供了一种简单的方式来组织代码、管理状态和处理导航,使得开发小型到中型应用变得更加高效。

安装

首先,你需要在 pubspec.yaml 文件中添加 tiny_frame 依赖:

dependencies:
  flutter:
    sdk: flutter
  tiny_frame: ^0.1.0 # 请使用最新版本

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

基本用法

tiny_frame 提供了几个核心概念,包括 FramePageStateManager。下面是一个简单的示例,展示如何使用 tiny_frame 来管理状态和路由。

1. 创建 Frame

Frametiny_frame 的核心类,用于管理应用的状态和路由。你可以在应用的入口处创建一个 Frame 实例:

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

void main() {
  final frame = Frame(
    initialPage: HomePage(),
    stateManager: AppStateManager(),
  );

  runApp(MyApp(frame: frame));
}

class MyApp extends StatelessWidget {
  final Frame frame;

  MyApp({required this.frame});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TinyFrame Demo',
      home: frame.builder(),
    );
  }
}

2. 创建 Page

Pagetiny_frame 中的一个概念,用于表示应用中的一个页面。你可以通过继承 Page 类来创建自定义页面:

class HomePage extends Page {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 导航到另一个页面
            Frame.of(context).push(AnotherPage());
          },
          child: Text('Go to Another Page'),
        ),
      ),
    );
  }
}

class AnotherPage extends Page {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Another Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回到上一个页面
            Frame.of(context).pop();
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

3. 管理状态

tiny_frame 提供了 StateManager 来管理应用的状态。你可以通过继承 StateManager 类来创建自定义的状态管理类:

class AppStateManager extends StateManager {
  int _counter = 0;

  int get counter => _counter;

  void incrementCounter() {
    _counter++;
    notifyListeners();
  }
}

在页面中,你可以通过 Frame.of(context).stateManager 来访问状态管理器,并根据需要更新状态:

class HomePage extends Page {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final stateManager = Frame.of(context).stateManager as AppStateManager;

    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Counter: ${stateManager.counter}'),
            ElevatedButton(
              onPressed: () {
                stateManager.incrementCounter();
              },
              child: Text('Increment Counter'),
            ),
            ElevatedButton(
              onPressed: () {
                Frame.of(context).push(AnotherPage());
              },
              child: Text('Go to Another Page'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部