Flutter动画加载按钮插件animation_loading_button的使用
Flutter动画加载按钮插件animation_loading_button的使用
animation_loading_button
animation_loading_button 是一个具有简单实现的带有动画加载状态的 Flutter 包,包含成功动画。
获取开始
要使用此包,请遵循以下步骤:
添加依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
animation_loading_button: ^0.0.4
导入包
在 Dart 文件中导入包:
import 'package:animation_loading_button/animation_loading_button.dart';
简单使用
在你的项目中使用加载按钮。以下是一个简单的示例:
LoadingButton(
type: LoadingButtonType.color,
// 按钮处于空闲状态时的内容。
idleStateWidget: const Text(
'Color button',
style: TextStyle(
color: Colors.black,
),
),
useEqualLoadingStateWidgetDimension: true,
// 是否启用按钮宽度的动画。默认为 `true`。
// 如果设置为 `false`,你可能需要将 `useEqualLoadingStateWidgetDimension` 参数设置为 `true`。
useAnimation: true,
loadingType: LoadingType.circleSpinIndicator,
// 如果你想要一个全宽的按钮,设置为 double.infinity
width: 150.0,
height: 40.0,
buttonColor: Colors.blueAccent,
loadingColor: Colors.white,
onPressed: () {},
)
完整示例
以下是一个完整的示例代码,展示了如何使用 animation_loading_button
插件:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'animation_loading_button.dart';
import 'loading/enum_indicator.dart';
import 'loading/loading_indicator.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,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
onButtonPressed() async {
await Future.delayed(const Duration(milliseconds: 3000), () => 42);
// 在 [onPressed] 后,它将触发从结束到开始的反向动画
return () {};
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Padding(
padding: const EdgeInsets.only(left: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(
height: 10,
),
const Text(
'Button style:',
style: CustomTextStyle.nameOfTextStyle,
textAlign: TextAlign.start,
),
const SizedBox(
height: 10,
),
Row(
children: [
const Expanded(
flex: 5,
child: Text(
'Type.color: ',
style: CustomTextStyle.buttonOfTextStyle,
),
),
Expanded(
flex: 4,
child: LoadingButton(
type: LoadingButtonType.color,
// 按钮处于空闲状态时的内容。
idleStateWidget: const Text(
'Button',
style: TextStyle(
color: Colors.black,
),
),
useEqualLoadingStateWidgetDimension: true,
// 是否启用按钮宽度的动画。默认为 `true`。
// 如果设置为 `false`,你可能需要将 `useEqualLoadingStateWidgetDimension` 参数设置为 `true`。
useAnimation: true,
loadingType: LoadingType.circularProgressIndicator,
// 如果你想要一个全宽的按钮,设置为 double.infinity
width: 150.0,
height: 40.0,
buttonColor: Colors.blueAccent,
loadingColor: Colors.white,
onPressed: onButtonPressed,
),
),
const Expanded(
flex: 3,
child: SizedBox(
width: 10,
)),
],
),
const SizedBox(
height: 10,
),
Row(
children: [
const Expanded(
flex: 5,
child: Text(
'Type.transparent: ',
style: CustomTextStyle.buttonOfTextStyle,
),
),
Expanded(
flex: 4,
child: LoadingButton(
type: LoadingButtonType.transparent,
// 按钮处于空闲状态时的内容。
idleStateWidget: const Text(
'Button',
style: TextStyle(
color: Colors.black,
),
),
useEqualLoadingStateWidgetDimension: true,
// 是否启用按钮宽度的动画。默认为 `true`。
// 如果设置为 `false`,你可能需要将 `useEqualLoadingStateWidgetDimension` 参数设置为 `true`。
useAnimation: true,
loadingType: LoadingType.circularProgressIndicator,
// 如果你想要一个全宽的按钮,设置为 double.infinity
width: 150.0,
height: 40.0,
buttonColor: Colors.blueAccent,
loadingColor: Colors.black,
onPressed: onButtonPressed,
),
),
const Expanded(
flex: 3,
child: SizedBox(
width: 10,
)),
],
),
const SizedBox(
height: 10,
),
Row(
children: [
const Expanded(
flex: 5,
child: Text(
'Type.text: ',
style: CustomTextStyle.buttonOfTextStyle,
),
),
Expanded(
flex: 4,
child: LoadingButton(
type: LoadingButtonType.text,
// 按钮处于空闲状态时的内容。
idleStateWidget: const Text(
'Button',
style: TextStyle(
color: Colors.black,
),
),
useEqualLoadingStateWidgetDimension: true,
// 是否启用按钮宽度的动画。默认为 `true`。
// 如果设置为 `false`,你可能需要将 `useEqualLoadingStateWidgetDimension` 参数设置为 `true`。
useAnimation: true,
loadingType: LoadingType.circularProgressIndicator,
// 如果你想要一个全宽的按钮,设置为 double.infinity
width: 150.0,
height: 30.0,
buttonColor: Colors.blueAccent,
loadingColor: Colors.black,
onPressed: onButtonPressed,
),
),
const Expanded(
flex: 3,
child: SizedBox(
width: 10,
)),
],
),
const SizedBox(
height: 20,
),
const Text(
'Loading Type:',
style: CustomTextStyle.nameOfTextStyle,
textAlign: TextAlign.start,
),
_bhallMultiple(),
_ballRotate(),
circularProgressIndicator(),
cupertinoActivityIndicator(),
ballPulse(),
const SizedBox(
height: 20,
),
const Text(
'Example:',
style: CustomTextStyle.nameOfTextStyle,
textAlign: TextAlign.start,
),
const SizedBox(
height: 10,
),
LoadingButton(
type: LoadingButtonType.transparent,
// 按钮处于空闲状态时的内容。
idleStateWidget: const Text(
'Button',
style: TextStyle(
color: Colors.black,
),
),
useEqualLoadingStateWidgetDimension: true,
// 是否启用按钮宽度的动画。默认为 `true`。
// 如果设置为 `false`,你可能需要将 `useEqualLoadingStateWidgetDimension` 参数设置为 `true`。
useAnimation: true,
loadingType: LoadingType.ballMultipleIndicator,
// 如果你想要一个全宽的按钮,设置为 double.infinity
width: 150.0,
height: 40.0,
buttonColor: Colors.black,
loadingColor: Colors.black,
onPressed: onButtonPressed,
),
],
),
),
);
}
// circularProgressIndicator,
// cupertinoActivityIndicator,
// ballPulseIndicator,
// ballMultipleIndicator,
// ballRotateIndicator
_bhallMultiple() {
return const Row(
children: [
Text(
'1. BallMultipleIndicator:',
style: CustomTextStyle.loadingOfStyle,
textAlign: TextAlign.start,
),
SizedBox(
height: 50,
width: 50,
child: LoadingIndicator(
indicatorType: Indicator.ballMultiple,
colors: [
Colors.black,
],
),
),
],
);
}
_ballRotate() {
return const Row(
children: [
Text(
'2. BallRotateIndicator:',
style: CustomTextStyle.loadingOfStyle,
textAlign: TextAlign.start,
),
SizedBox(
height: 50,
width: 50,
child: LoadingIndicator(
indicatorType: Indicator.ballRotate,
colors: [
Colors.black,
],
),
),
],
);
}
circularProgressIndicator() {
return const Row(
children: [
Text(
'3. CircularProgressIndicator:',
style: CustomTextStyle.loadingOfStyle,
textAlign: TextAlign.start,
),
SizedBox(
width: 5,
),
SizedBox(
height: 30,
width: 30,
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
Colors.black,
),
strokeWidth: 3.0,
),
),
],
);
}
cupertinoActivityIndicator() {
return const Row(
children: [
Text(
'4. cupertinoActivityIndicator:',
style: CustomTextStyle.loadingOfStyle,
textAlign: TextAlign.start,
),
SizedBox(
width: 5,
),
SizedBox(
height: 30,
width: 30,
child: CupertinoActivityIndicator(
color: Colors.black,
),
),
],
);
}
ballPulse() {
return const Row(
children: [
Text(
'5. BallPulse:',
style: CustomTextStyle.loadingOfStyle,
textAlign: TextAlign.start,
),
SizedBox(
width: 5,
),
SizedBox(
height: 30,
width: 30,
child: LoadingIndicator(
indicatorType: Indicator.ballPulse,
colors: [
Colors.black,
],
)),
],
);
}
}
class CustomTextStyle {
static const TextStyle nameOfTextStyle = TextStyle(
fontSize: 18,
color: Colors.black,
fontWeight: FontWeight.bold,
);
static const TextStyle buttonOfTextStyle = TextStyle(
fontSize: 18,
color: Colors.black,
fontWeight: FontWeight.normal,
);
static const TextStyle loadingOfStyle = TextStyle(
fontSize: 12,
color: Colors.black,
fontWeight: FontWeight.normal,
);
}
更多关于Flutter动画加载按钮插件animation_loading_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画加载按钮插件animation_loading_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用 animation_loading_button
Flutter 插件的示例代码。这个插件允许你创建一个带有加载动画的按钮,这在执行耗时操作时非常有用。
首先,确保在你的 pubspec.yaml
文件中添加 animation_loading_button
依赖:
dependencies:
flutter:
sdk: flutter
animation_loading_button: ^2.2.1 # 请根据需要检查最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,你可以在你的 Flutter 应用中使用这个按钮。下面是一个完整的示例,展示如何在点击按钮时显示加载动画,并在操作完成后恢复按钮状态。
import 'package:flutter/material.dart';
import 'package:animation_loading_button/animation_loading_button.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Animation Loading Button Example'),
),
body: Center(
child: MyLoadingButton(),
),
),
);
}
}
class MyLoadingButton extends StatefulWidget {
@override
_MyLoadingButtonState createState() => _MyLoadingButtonState();
}
class _MyLoadingButtonState extends State<MyLoadingButton> {
bool isLoading = false;
void handleButtonClick() async {
setState(() {
isLoading = true;
});
// 模拟一个耗时操作,例如网络请求
await Future.delayed(Duration(seconds: 3));
setState(() {
isLoading = false;
});
// 操作完成后可以显示一个SnackBar或者执行其他逻辑
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('操作完成!'),
));
}
@override
Widget build(BuildContext context) {
return AnimationLoadingButton(
animationType: AnimationType.progress, // 可以选择其他动画类型,如 'fade', 'slide', 'expand', 'rotate'
width: double.infinity,
height: 50,
color: Colors.blue,
borderRadius: BorderRadius.circular(25),
child: Text(
isLoading ? '加载中...' : '点击我',
style: TextStyle(color: Colors.white, fontSize: 18),
),
onPressed: isLoading ? null : handleButtonClick,
successAnimation: SuccessAnimation.scale, // 成功动画类型
successColor: Colors.green, // 成功动画颜色
errorAnimation: ErrorAnimation.shake, // 错误动画类型
errorColor: Colors.red, // 错误动画颜色
alwaysShowAnimation: false, // 如果设置为true,则即使onPressed为null也会显示动画
animationDuration: Duration(milliseconds: 700), // 动画持续时间
);
}
}
在这个示例中:
- 我们创建了一个
MyLoadingButton
小部件,它是一个有状态的小部件。 isLoading
状态用于控制按钮是否处于加载状态。handleButtonClick
方法模拟了一个耗时操作,并在操作完成后更新isLoading
状态。AnimationLoadingButton
被用来创建加载按钮,其属性包括动画类型、按钮尺寸、颜色、边框圆角、子组件(按钮文本)、点击事件处理函数等。
你可以根据需要调整这些属性来满足你的应用需求。