Flutter自定义组件插件fly_widget的使用

Flutter自定义组件插件fly_widget的使用

Installation 💻

在开始使用 fly_widget 插件之前,确保你的机器上已经安装了 Flutter SDK

在项目的 pubspec.yaml 文件中添加 fly_widget

dependencies:
  fly_widget:

然后运行以下命令来安装插件:

flutter packages get

Continuous Integration 🤖

fly_widget 自带了一个基于 GitHub Actions 的 CI 工作流,由 Very Good Workflows 提供支持。你可以根据需要添加自己的 CI/CD 解决方案。

默认情况下,在每次拉取请求或推送时,CI 会执行代码格式化、静态检查和测试。这确保了代码的一致性和正确性。项目使用了 Very Good Analysis 来设置严格的分析选项,并通过 Very Good Workflows 强制执行代码覆盖率。


Running Tests 🧪

对于首次使用,需要先安装 very_good_cli

dart pub global activate very_good_cli

运行所有单元测试并生成覆盖率报告:

very_good test --coverage

生成并查看覆盖率报告:

# 生成覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

使用示例

以下是一个完整的示例,展示了如何使用 fly_widget 插件中的自定义按钮组件。

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
        extensions: FlyExtensions.soft, // 使用默认主题扩展
      ),
      home: const MyHomePage(title: 'Fly Widget Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({
    super.key,
    required this.title,
  });

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            // 禁用的正向按钮
            const Padding(
              padding: EdgeInsets.all(8.0),
              child: FlyButton<FlyPositiveButtonExtension>(
                text: 'Disabled Positive Button',
              ),
            ),
            // 启用的正向按钮
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FlyButton<FlyPositiveButtonExtension>(
                text: 'Enabled Positive Button',
                onPressed: () {},
              ),
            ),
            // 禁用的负向按钮
            const Padding(
              padding: EdgeInsets.all(8.0),
              child: FlyButton<FlyNegativeButtonExtension>(
                text: 'Disabled Negative Button',
              ),
            ),
            // 启用的负向按钮
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FlyButton<FlyNegativeButtonExtension>(
                text: 'Enabled Negative Button',
                onPressed: () {},
              ),
            ),
            // 禁用的危险按钮
            const Padding(
              padding: EdgeInsets.all(8.0),
              child: FlyButton<FlyDangerousButtonExtension>(
                text: 'Disabled Dangerous Button',
              ),
            ),
            // 启用的危险按钮
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FlyButton<FlyDangerousButtonExtension>(
                text: 'Enabled Dangerous Button',
                onPressed: () {},
              ),
            ),
            const Text('Custom Style'), // 自定义样式
            // 自定义样式的危险按钮
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Theme(
                data: ThemeData(
                  extensions: const [
                    FlyDangerousButtonExtension(
                      textColor: Colors.red,
                      backgroundColor: Color(0xFFcfcfcf), // 浅灰色
                      borderRadius: 16, // 圆角半径
                    )
                  ],
                ),
                child: FlyButton<FlyDangerousButtonExtension>(
                  text: 'Custom Style Dangerous Button',
                  onPressed: () {},
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter自定义组件插件fly_widget的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


fly_widget 是一个 Flutter 插件,用于创建自定义动画组件。它允许开发者轻松地实现复杂的动画效果,而不需要编写大量的代码。以下是如何使用 fly_widget 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  fly_widget: ^1.0.0  # 请确保使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 fly_widget

import 'package:fly_widget/fly_widget.dart';

3. 使用 FlyWidget

FlyWidgetfly_widget 插件中的核心组件。你可以使用它来包裹你想要动画的子组件。

class MyAnimatedWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FlyWidget(
      child: Container(
        width: 100,
        height: 100,
        color: Colors.blue,
        child: Center(
          child: Text(
            'Fly Me!',
            style: TextStyle(color: Colors.white, fontSize: 20),
          ),
        ),
      ),
      animation: FlyAnimation(
        duration: Duration(seconds: 2),
        curve: Curves.easeInOut,
        offset: Offset(200, 200), // 动画结束位置的偏移量
        scale: 2.0, // 动画结束时的缩放比例
        rotation: 180, // 动画结束时的旋转角度
      ),
    );
  }
}

4. 控制动画

你可以通过 FlyController 来控制动画的开始、暂停、停止等操作。

class MyAnimatedWidget extends StatefulWidget {
  [@override](/user/override)
  _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
}

class _MyAnimatedWidgetState extends State<MyAnimatedWidget> {
  FlyController _controller = FlyController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        FlyWidget(
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Fly Me!',
                style: TextStyle(color: Colors.white, fontSize: 20),
              ),
            ),
          ),
          animation: FlyAnimation(
            duration: Duration(seconds: 2),
            curve: Curves.easeInOut,
            offset: Offset(200, 200),
            scale: 2.0,
            rotation: 180,
          ),
          controller: _controller,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () {
            _controller.start(); // 开始动画
          },
          child: Text('Start Animation'),
        ),
        ElevatedButton(
          onPressed: () {
            _controller.pause(); // 暂停动画
          },
          child: Text('Pause Animation'),
        ),
        ElevatedButton(
          onPressed: () {
            _controller.reset(); // 重置动画
          },
          child: Text('Reset Animation'),
        ),
      ],
    );
  }
}

5. 自定义动画

FlyAnimation 提供了多个参数来自定义动画效果,包括 offset(偏移量)、scale(缩放)、rotation(旋转)等。你可以根据需求调整这些参数来创建不同的动画效果。

6. 运行项目

完成上述步骤后,运行你的 Flutter 项目,你应该能够看到自定义的动画效果。

示例代码

以下是一个完整的示例代码,展示了如何使用 fly_widget 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('FlyWidget Example'),
        ),
        body: Center(
          child: MyAnimatedWidget(),
        ),
      ),
    );
  }
}

class MyAnimatedWidget extends StatefulWidget {
  [@override](/user/override)
  _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
}

class _MyAnimatedWidgetState extends State<MyAnimatedWidget> {
  FlyController _controller = FlyController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        FlyWidget(
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Fly Me!',
                style: TextStyle(color: Colors.white, fontSize: 20),
              ),
            ),
          ),
          animation: FlyAnimation(
            duration: Duration(seconds: 2),
            curve: Curves.easeInOut,
            offset: Offset(200, 200),
            scale: 2.0,
            rotation: 180,
          ),
          controller: _controller,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () {
            _controller.start();
          },
          child: Text('Start Animation'),
        ),
        ElevatedButton(
          onPressed: () {
            _controller.pause();
          },
          child: Text('Pause Animation'),
        ),
        ElevatedButton(
          onPressed: () {
            _controller.reset();
          },
          child: Text('Reset Animation'),
        ),
      ],
    );
  }
}
回到顶部