Flutter动画加载按钮插件animated_loading_button的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter动画加载按钮插件animated_loading_button的使用

动画加载按钮介绍

Animated Loading Button 插件帮助你创建具有自定义设计的动画按钮。这个动画按钮使用异步回调。

示例代码

下面是一个完整的示例代码,展示了如何使用 animated_loading_button 插件创建不同类型的动画按钮。

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const ExampleScreen(),
    );
  }
}

class ExampleScreen extends StatelessWidget {
  const ExampleScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            AnimatedLoadingButton<void>.iconRotation(
              buttonText: const Text('Login'),
              buttonIcon: const Icon(Icons.logout_outlined),
              onPress: onPress,
              onAsyncCallFinished: (value) {
                print('Login successfull');
              },
            ),
            const SizedBox(
              height: 20,
            ),
            AnimatedLoadingButton<void>.colorChangingButton(
              buttonChild: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: const [Icon(Icons.login), Text('Login')],
              ),
              colors: [
                Colors.blue[400]!,
                Colors.blue[800]!,
                Colors.blue[900]!,
              ],
              onPress: onPress,
              onAsyncCallFinished: (value) {},
            ),
            const SizedBox(
              height: 20,
            ),
            AnimatedLoadingButton<void>.fadingAnimation(
              buttonChild: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: const [Icon(Icons.login), Text('Login')],
              ),
              onPress: onPress,
              onAsyncCallFinished: (value) {},
            ),
            const SizedBox(
              height: 220,
            ),
            AnimatedLoadingButton<void>.progressIndicator(
              buttonChild: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: const [Icon(Icons.login), Text('Login')],
              ),
              onPress: onPress,
              onAsyncCallFinished: (value) {},
            ),
          ],
        ),
      ),
    );
  }

  Future<void> onPress() async {
    await Future.delayed(
      const Duration(
        milliseconds: 4000,
      ),
    );
  }
}

参数说明

  • onPress: 按钮被点击时触发的异步回调。
  • onAsyncCallFinished: 异步回调完成时触发的回调。
  • buttonWidth: 按钮宽度,默认为 200。
  • buttonHeight: 按钮高度,默认为 50。
  • animationDuration: 所有动画的持续时间,除了进度指示器动画。
  • buttonColor: 默认情况下,按钮颜色为 Colors.blue
  • buttonRadius: 按钮圆角,默认为 null。
  • buttonShadow: 按钮阴影,默认为 null。
  • buttonChild: 按钮内部渲染的子组件。
  • buttonIcon: 动态图标按钮中需要绘制的图标。
  • buttonText: 动态图标按钮中需要显示的文本。
  • colors: 颜色变化动画所需的颜色列表。
  • progressIndicatorColor: 进度指示器的颜色,默认为 Colors.blue
  • progressIndicatorBackground: 进度指示器的背景颜色,默认为 Colors.white
  • progressIndicatorSize: 进度指示器的高度,默认为 5。

示例代码解释

  1. Rotated Icon Animation

    AnimatedLoadingButton<void>.iconRotation(
      buttonText: const Text('Login'),
      buttonIcon: const Icon(Icons.logout_outlined),
      onPress: onPress,
      onAsyncCallFinished: (value) {
        print('Login successfull');
      },
    ),
    
    • buttonText: 显示在按钮上的文本。
    • buttonIcon: 按钮内部的图标。
    • onPress: 按钮被点击时触发的异步回调。
    • onAsyncCallFinished: 异步回调完成时触发的回调。
  2. Color Changing Animation

    AnimatedLoadingButton<void>.colorChangingButton(
      buttonChild: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: const [Icon(Icons.login), Text('Login')],
      ),
      colors: [
        Colors.blue[400]!,
        Colors.blue[800]!,
        Colors.blue[900]!,
      ],
      onPress: onPress,
      onAsyncCallFinished: (value) {},
    ),
    
    • buttonChild: 按钮内部渲染的子组件。
    • colors: 颜色变化动画所需的颜色列表。
  3. Fading Animation

    AnimatedLoadingButton<void>.fadingAnimation(
      buttonChild: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: const [Icon(Icons.login), Text('Login')],
      ),
      onPress: onPress,
      onAsyncCallFinished: (value) {},
    ),
    
    • buttonChild: 按钮内部渲染的子组件。
  4. Progress Indicator Animation

    AnimatedLoadingButton<void>.progressIndicator(
      buttonChild: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: const [Icon(Icons.login), Text('Login')],
      ),
      onPress: onPress,
      onAsyncCallFinished: (value) {},
    ),
    

更多关于Flutter动画加载按钮插件animated_loading_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画加载按钮插件animated_loading_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用animated_loading_button插件的示例代码。这个插件允许你创建一个带有加载动画的按钮,非常适合在提交表单或进行网络请求时显示。

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

dependencies:
  flutter:
    sdk: flutter
  animated_loading_button: ^2.0.0  # 请确保使用最新版本

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

接下来是一个完整的示例代码,展示如何使用AnimatedLoadingButton

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isLoading = false;

  void handleButtonPress() async {
    setState(() {
      isLoading = true;
    });

    // 模拟一个异步操作,比如网络请求
    await Future.delayed(Duration(seconds: 2));

    setState(() {
      isLoading = false;
    });

    // 可以在这里处理请求完成后的逻辑,比如显示成功提示
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
      content: Text('操作成功!'),
      duration: Duration(seconds: 1),
    ));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Loading Button Demo'),
      ),
      body: Center(
        child: AnimatedLoadingButton(
          size: Size(200, 50),
          loading: isLoading,
          child: Text(
            '提交',
            style: TextStyle(color: Colors.white),
          ),
          loadingWidget: CircularProgressIndicator(
            valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
          ),
          onPressed: handleButtonPress,
          successAnimation: SuccessAnimation.shake,
          errorAnimation: ErrorAnimation.shake,
          successColor: Colors.green,
          errorColor: Colors.red,
          disabledColor: Colors.grey,
          borderColor: Colors.blue,
          borderWidth: 2.0,
          elevation: 5.0,
          borderRadius: 25.0,
          childPadding: EdgeInsets.all(10.0),
          animationDuration: 700,
        ),
      ),
    );
  }
}

代码解释

  1. 依赖项:在pubspec.yaml文件中添加animated_loading_button依赖项。
  2. 导入包:在代码中导入animated_loading_button包。
  3. 状态管理:使用_MyHomePageState中的isLoading状态来控制按钮的加载状态。
  4. 按钮点击处理:在handleButtonPress方法中模拟一个异步操作(例如网络请求),并在操作完成后更新isLoading状态。
  5. 按钮配置
    • size:按钮的大小。
    • loading:是否处于加载状态。
    • child:按钮上的文本。
    • loadingWidget:加载时的动画(例如CircularProgressIndicator)。
    • onPressed:按钮点击时的回调函数。
    • successAnimationerrorAnimation:成功和错误时的动画效果。
    • successColorerrorColor:成功和错误时的按钮颜色。
    • disabledColor:按钮禁用时的颜色。
    • borderColorborderWidth:按钮边框的颜色和宽度。
    • elevation:按钮的阴影。
    • borderRadius:按钮的圆角。
    • childPadding:按钮内部填充。
    • animationDuration:动画持续时间。

这样,你就可以在Flutter应用中使用animated_loading_button插件来创建一个带有加载动画的按钮了。

回到顶部