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
更多关于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
FlyWidget
是 fly_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'),
),
],
);
}
}