Flutter榫卯结构模拟插件tenon_mortise的使用

Flutter榫卯结构模拟插件tenon_mortise的使用

轻松构建你的小部件,避免括号嵌套,易于构建UI,有点像Swift UI。

开始使用

要使用此插件,在pubspec.yaml文件中添加tenon_mortise作为依赖项。

dependencies:
  tenon_mortise: ^x.x.x

确保运行flutter pub get以安装依赖项。

示例

以下是使用tenon_mortise插件的基本示例:

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

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool flag1 = true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: [
          // 创建一个包含两个文本的小部件行,并在它们之间插入20像素间距
          ["row Item1 ".toText(), 20.inRow, "row item 2".toText()].toRow(),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含三个文本的小部件行,每个文本有不同的背景颜色
          [
            "row Item1".toText().applyContainer(color: Colors.red),
            "row item 2".toText().applyContainer(color: Colors.green),
            "row item 2"
                .toText()
                .applyContainer(color: Colors.tealAccent)
                .expanded,
          ].toRow(),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含图标和文本的列
          [const Icon(Icons.info), 10.inColumn, "column test ".toText()]
              .toColumn(),
          // 插入20像素垂直间距
          20.inColumn,
          // 对齐方式为居左的文本
          "aligment left".toText().applyAlign(alignment: Alignment.centerLeft),
          // 对齐方式为居右的文本
          "aligment right"
              .toText()
              .applyAlign(alignment: Alignment.centerRight),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含五个文本的小部件网格视图
          [
            "GridItem1"
                .toText()
                .applyContainer(color: Colors.tealAccent)
                .applyRadiusAll(10),
            "GridItem2".toText().applyContainer(color: Colors.red).applyRadius(
                borderRadius:
                    const BorderRadius.only(topLeft: Radius.circular(10))),
            "GridItem3".toText().applyContainer(color: Colors.green),
            "GridItem4".toText().applyContainer(color: Colors.blue),
            "GridItem5".toText().applyContainer(color: Colors.yellow),
          ]
              .toGridView(
                scrollDirection: Axis.vertical,
                gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2,
                  childAspectRatio: 4,
                  mainAxisSpacing: 10,
                  crossAxisSpacing: 10,
                ),
              )
              .applySizeBox(
                height: 100,
                width: double.infinity,
              ),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含七个文本的小部件包装视图
          [
            "Wrap1 opacity:0.5"
                .toText()
                .applyContainer(color: Colors.tealAccent, width: 120)
                .applyOpacity(opacity: 0.5),
            "Wrap2 opacity:0.8"
                .toText()
                .applyContainer(color: Colors.red, width: 130)
                .applyOpacity(opacity: 0.8),
            "Wrap3".toText().applyContainer(color: Colors.green, width: 100),
            "Wrap4".toText().applyContainer(color: Colors.blue, width: 100),
            "Wrap5".toText().applyContainer(color: Colors.yellow, width: 100),
            "Wrap6".toText().applyContainer(color: Colors.yellow, width: 100),
            "Wrap7".toText().applyContainer(color: Colors.yellow, width: 100),
          ].toWrap(),
          // 插入一个开关控件,并根据其状态显示不同的文本
          [
            Switch(
                value: flag1,
                onChanged: (value) {
                  setState(() {
                    flag1 = value;
                  });
                }),
            flag1.toWidget(
              builder: () =>
                  "flag 1 to widget".toText().applyColor(color: Colors.red),
            ),
            20.inRow,
            "flag 1 to widget where flag ==false".toText().where(flag1 == false)
          ].toRow(),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含两个文本的小部件行,点击时显示不同的信息
          [
            "inkwell:true click".toText().onClick(
                  inkWell: true,
                  click: () {
                    print("inkwell:true click");
                  },
                ),
            "inkwell:false click".toText().onClick(
                  inkWell: false,
                  click: () {
                    print("inkwell:false click");
                  },
                ),
          ].toRow(mainAxisAlignment: MainAxisAlignment.spaceEvenly),
          // 插入20像素垂直间距
          20.inColumn,
          // 创建一个包含两个文本的小部件行,分别应用了不同的手势检测器
          [
            "applyInkWell".toText().applyInkWell(
              onTap: () {
                print("applyInkWell");
              },
            ),
            "applyGestureDetector".toText().applyGestureDetector(
              onTap: () {
                print("applyGestureDetector");
              },
            ),
          ].toRow(mainAxisAlignment: MainAxisAlignment.spaceEvenly)
        ].toListView(),
      ),
    );
  }
}

更多关于Flutter榫卯结构模拟插件tenon_mortise的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter榫卯结构模拟插件tenon_mortise的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter中的tenon_mortise插件来模拟榫卯结构的示例代码。请注意,tenon_mortise是一个假设的插件名称,因为实际Flutter生态系统中可能没有现成的此类插件。但我可以基于Flutter的一般开发流程,展示如何模拟榫卯结构的一些基本思路。

首先,你需要假设或创建一个Flutter插件,该插件提供了榫卯结构的模拟功能。在这个例子中,我们将使用自定义绘图和动画来模拟榫卯结构。

1. 添加依赖(假设插件存在)

在你的pubspec.yaml文件中添加依赖项(注意,这里假设tenon_mortise插件存在):

dependencies:
  flutter:
    sdk: flutter
  tenon_mortise: ^1.0.0  # 假设版本号

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

2. 导入插件并创建榫卯结构模拟

在你的Dart文件中,导入插件并创建榫卯结构的模拟。以下是一个简化的示例:

import 'package:flutter/material.dart';
import 'package:tenon_mortise/tenon_mortise.dart'; // 假设插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('榫卯结构模拟'),
        ),
        body: TenonMortiseSimulation(),
      ),
    );
  }
}

class TenonMortiseSimulation extends StatefulWidget {
  @override
  _TenonMortiseSimulationState createState() => _TenonMortiseSimulationState();
}

class _TenonMortiseSimulationState extends State<TenonMortiseSimulation> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0, end: 1).animate(_controller);
  }

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      size: Size(double.infinity, double.infinity),
      painter: TenonMortisePainter(_animation.value),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

class TenonMortisePainter extends CustomPainter {
  final double animationValue;

  TenonMortisePainter(this.animationValue);

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = Colors.brown
      ..style = PaintingStyle.fill;

    // 画榫头
    final tenonPath = Path()
      ..moveTo(size.width * 0.2, size.height * 0.5)
      ..lineTo(size.width * 0.3, size.height * 0.4)
      ..lineTo(size.width * 0.3, size.height * 0.6)
      ..close();

    canvas.drawPath(tenonPath, paint);

    // 画卯眼,根据动画值调整位置
    final mortisePath = Path()
      ..moveTo(size.width * 0.7 - animationValue * 50, size.height * 0.5 - animationValue * 20)
      ..addRect(Rect.fromLTWH(
        size.width * 0.7 - animationValue * 50 - 20,
        size.height * 0.5 - animationValue * 20 - 20,
        40,
        40,
      ));

    canvas.drawPath(mortisePath, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return oldDelegate != this;
  }
}

3. 解释代码

  • 依赖项:我们假设了一个tenon_mortise插件,并在pubspec.yaml中添加了它。
  • 主应用MyApp是我们的主应用,它包含一个Scaffold,其中包含一个自定义的TenonMortiseSimulation小部件。
  • 动画控制_TenonMortiseSimulationState管理动画控制器,它控制榫卯结构的模拟动画。
  • 自定义绘制TenonMortisePainter类使用CustomPainter来绘制榫头和卯眼。榫头位置固定,而卯眼的位置根据动画值动态调整,模拟榫卯结构的配合过程。

请注意,这只是一个非常简化的示例,实际的榫卯结构模拟可能需要更复杂的几何计算和物理模拟。如果tenon_mortise插件不存在,你可能需要自己实现这些功能,或者寻找其他适合的图形和动画库来辅助开发。

回到顶部