Flutter防抖按钮插件future_debounce_button的使用

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

Flutter防抖按钮插件 future_debounce_button 的使用

Future Debounce Button (FDB) 是一个用于处理异步调用的按钮小部件,它通过视觉指示来提升代码的整洁性和用户体验。以下是关于如何使用这个插件的详细指南。

特性

  • 提供了一个完整的样板来处理和防抖(debouncing)异步请求(如API调用等)。
  • FDB按钮管理其状态,并基于提供的未来(future)及其状态进行显示。

快速开始

安装

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

dependencies:
  future_debounce_button: ^latest_version

然后运行flutter pub get

基本使用

FDB按钮的唯一必需参数是onPressed未来(future)。其他都是可选的。

// 示例:一个处理类型为`Future<int>`的按钮
FutureDebounceButton<int>(
    onPressed: () async => submit(), // 必需:要处理的未来
    onSuccess: (result) => print('Success with result $result'), // 可选:成功时的操作
    onError: (error, stackTrace) => print('Error occurred: $error'), // 可选:错误处理
    onAbort: () => print('Operation aborted by user') // 可选:用户取消操作时的动作
);

例如,下面是一个"提交"按钮的示例,当点击时会触发一个异步操作。如果操作失败,按钮将进入“错误”状态2秒;如果成功,则永久进入“成功”状态,防止用户再次调用该未来。

/// 向服务器提交请求
Future<bool> submit() async {
    await Future.delayed(Duration(seconds: 2)); // 模拟网络延迟
    return true;
}

// '提交'按钮
FutureDebounceButton<bool>(
    buttonType: FDBType.outlined, // 显示OutlinedButton小部件
    onPressed: submit,
    actionCallText: 'Submit',
    errorStateDuration: Duration(seconds: 2), // 显示'Error'2秒钟
    successStateDuration: null // 成功后永远锁定在'Success!'
);

按钮类型

你可以从以下值中选择按钮类型:elevated, filled, filledTonal, outlined, 和 text

Material Widget
FDBType.elevated ElevatedButton
FDBType.filled FilledButton
FDBType.filledTonal FilledButton.tonal
FDBType.outlined OutlinedButton
FDBType.text TextButton

按钮类型

状态

按钮根据所提供的未来的状态自我管理状态。可能的状态包括:

  • disabled:按钮完全禁用或在按下后被禁用一段debounceDuration时间。
  • ready:按钮处于正常的“行动号召”状态。
  • loading:按钮已被按下并且正在执行未来。
  • abort:如果提供了onAbort处理器,用户可以取消正在执行的未来。
  • success:未来已成功完成。
  • error:未来因超时或产生错误而失败。

示例Demo

这里提供一个更全面的示例,展示如何在应用中集成future_debounce_button

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:future_debounce_button/future_debounce_button.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  Future<int> _futureThatCompletes() async {
    await Future.delayed(Duration(seconds: 2));
    return 1;
  }

  Future<int> _future(int i) async {
    return await _futureThatCompletes();
  }

  void _incrementCounter(int value) {
    setState(() {
      _counter += value;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Future Debounce Button Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FutureDebounceButton<int>(
              onPressed: () async => _future(0),
              onSuccess: _incrementCounter,
              actionCallText: 'Click Me',
              errorStateDuration: Duration(seconds: 2),
              successStateDuration: null,
            ),
            Text('You have pushed the button this many times: $_counter'),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用future_debounce_button插件的示例代码。这个插件主要用于防抖处理,防止用户在短时间内多次点击按钮。

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

dependencies:
  flutter:
    sdk: flutter
  future_debounce_button: ^最新版本号  # 替换为实际最新版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以这样使用FutureDebounceButton

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Future Debounce Button Example'),
        ),
        body: Center(
          child: MyDebounceButtonWidget(),
        ),
      ),
    );
  }
}

class MyDebounceButtonWidget extends StatefulWidget {
  @override
  _MyDebounceButtonWidgetState createState() => _MyDebounceButtonWidgetState();
}

class _MyDebounceButtonWidgetState extends State<MyDebounceButtonWidget> {
  final _debounceDuration = Duration(seconds: 2); // 防抖时间间隔

  void _handleButtonClick() async {
    print('Button clicked at: ${DateTime.now()}');
    // 模拟一个异步操作,例如网络请求
    await Future.delayed(Duration(seconds: 1));
    print('Button click action completed');
  }

  @override
  Widget build(BuildContext context) {
    return FutureDebounceButton(
      onPressed: _handleButtonClick,
      debounceDuration: _debounceDuration,
      child: Text('Click Me'),
      loadingChild: CircularProgressIndicator(), // 当按钮处于加载状态时显示的组件
    );
  }
}

在这个示例中:

  1. 我们创建了一个MyApp应用,它包含一个Scaffold和一个居中的Center组件。
  2. Center组件包含一个自定义的MyDebounceButtonWidget
  3. MyDebounceButtonWidget是一个有状态的组件,它包含一个FutureDebounceButton
  4. FutureDebounceButtononPressed属性绑定了一个_handleButtonClick函数,这个函数模拟了一个异步操作(例如网络请求)。
  5. debounceDuration属性设置了防抖时间间隔为2秒。
  6. child属性设置了按钮显示的文本为"Click Me"。
  7. loadingChild属性设置了当按钮处于加载状态时显示的组件,这里使用了一个CircularProgressIndicator

这样,当用户点击按钮时,如果在2秒内再次点击,只有第一次点击会触发_handleButtonClick函数。在按钮处于加载状态时,会显示一个圆形进度指示器。

这个示例展示了如何使用future_debounce_button插件来实现按钮的防抖功能,防止用户在短时间内多次触发按钮点击事件。

回到顶部