flutter的debounce_throttle插件使用

XML 复制代码
debounce_throttle: ^2.0.0

使用:

Dart 复制代码
// ignore_for_file: avoid_print

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

void main() {
  runApp(const MaterialApp(
    home: DemoPage(),
  ));
}

class DemoPage extends StatefulWidget {
  const DemoPage({super.key});

  @override
  State<DemoPage> createState() => _DemoPageState();
}

class _DemoPageState extends State<DemoPage> {
  // 输入框的防抖
  final _searchController = TextEditingController();
  final _searchDebouncer =
      Debouncer(const Duration(milliseconds: 1000), initialValue: "");

  // 监听按钮的防抖
  final _clickController = MaterialStatesController();
  final _clickDebouncer =
      Debouncer(const Duration(milliseconds: 1000), initialValue: "");

  // 普通函数的防抖
  final _anyDebouncer =
      Debouncer(const Duration(milliseconds: 1000), initialValue: "");

  void anyFn() {
    print("anyFn触发");
    _anyDebouncer.notify("随便什么值");
  }

  @override
  void initState() {
    super.initState();
    // 输入框的防抖
    _searchDebouncer.values.listen((search) => fn1(search));
    _searchController.addListener(() {
      print("输入框改变了值:${_searchController.text}");
      _searchDebouncer.value = _searchController.text;
    });

    // 监听按钮的防抖
    _clickDebouncer.values.listen((_) => fn2());
    _clickController.addListener(() {
      // 只有当按钮pressed时,才触发防抖,而非hover等
      if (_clickController.value.contains(MaterialState.pressed)) {
        print("点击了按钮");
        _clickDebouncer.notify("随便什么值");
      }
    });

    // 某个函数的防抖
    _anyDebouncer.values.listen((_) => fn3());
  }

  @override
  void dispose() {
    _searchDebouncer.cancel();
    _clickDebouncer.cancel();
    _anyDebouncer.cancel();
    _searchController.dispose();
    _clickController.dispose();
    super.dispose();
  }

  void fn1(String query) {
    print("输入框防抖函数触发:调用接口等。。。");
  }

  void fn2() {
    print("按钮防抖函数触发:调用接口等。。。");
  }

  void fn3() {
    print("any函数触发:调用接口等。。。");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('防抖案例'),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(10),
            child: TextField(
              controller: _searchController,
            ),
          ),
          ElevatedButton(
              statesController: _clickController,
              onPressed: () {},
              child: const Icon(Icons.access_time_filled_rounded)),
          ElevatedButton(
              onPressed: anyFn, child: const Icon(Icons.access_alarm)),
        ],
      ),
    );
  }
}
相关推荐
莫物几秒前
element el-table表格 添加唯一标识
前端·javascript·vue.js
乾元几秒前
基于时序数据的异常预测——短期容量与拥塞的提前感知
运维·开发语言·网络·人工智能·python·自动化·运维开发
江上清风山间明月1 分钟前
使用python将markdown文件生成pdf文件
开发语言·python·pdf
j_xxx404_4 分钟前
C++算法入门:二分查找合集(二分查找|在排序数组中查找元素的第一个和最后一个位置)
开发语言·c++
ss2737 分钟前
阻塞队列:ArrayBlockingQueue如何用Lock与Condition实现高效并发控制
开发语言·python
CodeCraft Studio11 分钟前
Vaadin 25 正式发布:回归标准Java Web,让企业级开发更简单、更高效
java·开发语言·前端·vaadin·java web 框架·纯java前端框架·企业级java ui框架
Shirley~~14 分钟前
PPTist 幻灯片工具栏Toolbar部分
开发语言·前端·javascript
|晴 天|15 分钟前
Promise 与 async/await 错误处理最佳实践指南
开发语言·前端·javascript
_OP_CHEN17 分钟前
【Python基础】(三)Python 语法基础进阶:条件循环 + 实战案例,从入门到精通的核心跳板
开发语言·python·python入门·条件语句·循环语句·python基础语法
苹果电脑的鑫鑫17 分钟前
.eslintrc.js这个文件作用
开发语言·javascript·ecmascript