Flutter涟漪效果动作按钮插件ripple_action_button的使用

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

Flutter涟漪效果动作按钮插件 ripple_action_button 的使用

RippleActionButton 是一个强大且可定制的 Flutter 小部件,提供带有涟漪效果和多种状态(idleloadingsuccesserror)的交互式按钮。本文将详细介绍如何使用该插件,并提供完整的示例代码。

插件功能特点

  • 多种状态idleloadingsuccesserror
  • 自定义小部件:为每个状态定义独特的外观。
  • 高度可定制:可以使用任何小部件作为按钮内容(例如文本、图标、图像或复杂的布局)。
  • 平滑过渡:控制状态之间的动画和持续时间。
  • 涟漪效果:自定义涟漪飞溅颜色、不透明度、持续时间和涟漪效果工厂。
  • 回调函数:处理生命周期事件(如 onIdleonLoadingonSuccessonError 等)。
  • 错误处理:具有 onException 回调的安全异常处理。
  • 程序化交互:使用 simulateClick() 模拟点击。
  • 键盘处理:自动隐藏键盘 (autoHideKeyboard)。
  • 响应式设计:自动适应或接受显式尺寸。
  • 辅助功能支持:语义标签以提高可用性。
  • 启用/禁用状态:使用 enabled 属性控制交互性。

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  ripple_action_button: ^1.1.3

或者使用命令行安装:

flutter pub add ripple_action_button

然后在 Dart 文件中导入:

import 'package:ripple_action_button/ripple_action_button.dart';

使用示例

基本空闲按钮示例

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text(
      'Submit',
      style: TextStyle(color: Colors.white, fontSize: 18),
    ),
  ),
  onPressed: () async {
    // 模拟异步操作
    await Future.delayed(Duration(seconds: 2));
    return true; // 返回 true 表示成功,false 表示失败
  },
)

带加载、成功和错误状态的按钮

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Start Action', style: TextStyle(color: Colors.white)),
  ),
  loadingWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: CircularProgressIndicator(color: Colors.white),
  ),
  successWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Icon(Icons.check, color: Colors.white),
  ),
  errorWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Icon(Icons.error, color: Colors.red),
  ),
  onPressed: () async {
    // 模拟操作
    await Future.delayed(Duration(seconds: 3));
    return true; // 成功返回 true
  },
  onComplete: (status) async {
    print('Button finished with status: $status');
  },
)

带有 enabled 属性的按钮

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Disabled Button', style: TextStyle(color: Colors.grey)),
  ),
  enabled: false, // 按钮被禁用
  onPressed: () async {
    return true;
  },
)

使用 GlobalKey 模拟点击

final GlobalKey<RippleActionButtonState> buttonKey = GlobalKey<RippleActionButtonState>();

RippleActionButton(
  key: buttonKey,
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Simulate Click', style: TextStyle(color: Colors.white)),
  ),
  onPressed: () async {
    // 模拟异步操作
    await Future.delayed(Duration(seconds: 2));
    return true;
  },
);

// 在其他地方调用
buttonKey.currentState?.simulateClick();

自动隐藏键盘的按钮

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Submit', style: TextStyle(color: Colors.white)),
  ),
  autoHideKeyboard: true,
  onPressed: () async {
    return true;
  },
)

加载小部件自定义

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Upload File', style: TextStyle(color: Colors.white)),
  ),
  loadingWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Row(
      mainAxisSize: MainAxisSize.min,
      children: [
        CircularProgressIndicator(color: Colors.white),
        SizedBox(width: 8),
        Text('Uploading...', style: TextStyle(color: Colors.white)),
      ],
    ),
  ),
  onPressed: () async {
    await Future.delayed(Duration(seconds: 5));
    return true;
  },
)

成功和错误定时

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Action', style: TextStyle(color: Colors.white)),
  ),
  successWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Icon(Icons.check, color: Colors.green),
  ),
  errorWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Icon(Icons.error, color: Colors.red),
  ),
  successDuration: Duration(seconds: 3),
  errorDuration: Duration(seconds: 2),
  onPressed: () async {
    return false; // 模拟错误
  },
)

按钮样式

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Custom Style', style: TextStyle(color: Colors.white)),
  ),
  buttonDecoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12.0),
    boxShadow: [
      BoxShadow(
        color: Colors.black26,
        offset: Offset(0, 4),
        blurRadius: 8.0,
      ),
    ],
  ),
  onPressed: () async {
    return true;
  },
)

复杂多行多列按钮示例

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            Icon(Icons.upload, color: Colors.white),
            SizedBox(width: 8),
            Text('Upload File', style: TextStyle(color: Colors.white)),
          ],
        ),
        SizedBox(height: 8),
        Text('Tap to upload your files', style: TextStyle(color: Colors.white70, fontSize: 12)),
      ],
    ),
  ),
  loadingWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        CircularProgressIndicator(color: Colors.white),
        SizedBox(height: 8),
        Text('Uploading...', style: TextStyle(color: Colors.white)),
      ],
    ),
  ),
  successWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Icon(Icons.check_circle, color: Colors.green, size: 32),
        SizedBox(height: 8),
        Text('Upload Successful!', style: TextStyle(color: Colors.white)),
      ],
    ),
  ),
  errorWidget: Padding(
    padding: EdgeInsets.all(12.0),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Icon(Icons.error, color: Colors.red, size: 32),
        SizedBox(height: 8),
        Text('Upload Failed', style: TextStyle(color: Colors.white)),
      ],
    ),
  ),
  onPressed: () async {
    // 模拟长时间操作
    await Future.delayed(Duration(seconds: 4));
    return true; // 返回 false 表示错误
  },
)

自定义涟漪效果示例

RippleActionButton(
  idleWidget: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Ripple Custom', style: TextStyle(color: Colors.white)),
  ),
  rippleSplashFactory: InkRipple.splashFactory, // 使用自定义涟漪效果
  rippleSplashColor: Colors.yellow.withOpacity(0.5),
  rippleHighlightColor: Colors.yellow.withOpacity(0.3),
  onPressed: () async {
    await Future.delayed(Duration(seconds: 2));
    return true;
  },
)

通过上述示例,您可以根据需求进一步定制 RippleActionButton。希望这些示例能帮助您更好地理解和使用这个强大的 Flutter 插件!


更多关于Flutter涟漪效果动作按钮插件ripple_action_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter涟漪效果动作按钮插件ripple_action_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用ripple_action_button插件来创建带有涟漪效果的动作按钮的示例代码。这个插件允许你创建一个带有动画效果的浮动动作按钮(FAB),非常适合需要吸引用户注意的场景。

首先,确保你已经在pubspec.yaml文件中添加了ripple_action_button依赖:

dependencies:
  flutter:
    sdk: flutter
  ripple_action_button: ^x.y.z  # 请替换为最新的版本号

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

接下来,在你的Flutter项目中,你可以按照以下方式使用RippleActionButton

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Ripple Action Button Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Ripple Action Button Demo'),
        ),
        body: Center(
          child: RippleActionButton(
            // 主按钮的图标和颜色
            mainButton: RippleMainButton(
              icon: Icons.add,
              color: Colors.blue,
            ),
            // 子按钮列表,每个子按钮的图标、颜色以及点击事件
            actions: <RippleActionButton>[
              RippleActionButton(
                icon: Icons.directions_car,
                color: Colors.red,
                onPressed: () {
                  // 子按钮点击事件处理
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Car selected')),
                  );
                },
              ),
              RippleActionButton(
                icon: Icons.directions_transit,
                color: Colors.green,
                onPressed: () {
                  // 子按钮点击事件处理
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Transit selected')),
                  );
                },
              ),
              RippleActionButton(
                icon: Icons.directions_bike,
                color: Colors.yellow,
                onPressed: () {
                  // 子按钮点击事件处理
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Bike selected')),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  • RippleActionButton被用来创建一个主要的浮动动作按钮(FAB)和几个子按钮。
  • RippleMainButton定义了主按钮的图标和颜色。
  • actions列表包含了多个RippleActionButton,每个子按钮都有自己的图标、颜色和点击事件处理函数。

当用户点击主按钮时,子按钮会以涟漪效果展开;当用户点击某个子按钮时,会触发相应的onPressed回调,这里我们用ScaffoldMessenger.of(context).showSnackBar来显示一个简单的消息提示。

你可以根据需要调整图标、颜色和处理逻辑,以适应你的应用需求。

回到顶部