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)),
        ],
      ),
    );
  }
}
相关推荐
知识分享小能手12 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习
今年下半年12 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理12 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
思茂信息13 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
阿里嘎多学长13 小时前
2026-09-28 GitHub 热点项目精选
开发语言·程序员·github·代码托管
程序猿编码14 小时前
C++/CUDA 手写 LLM 推理引擎:拆解 vLLM 核心 PagedAttention 与连续批处理
开发语言·c++·深度学习·神经网络·推理·vllm
hold?fish:palm14 小时前
44 二叉搜索树中第K小的元素
开发语言·c++·算法
凉茶钱14 小时前
【吃透C++】万字解析类和对象
开发语言·c++
白杨尚青15 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
可乐鸡翅yeah_15 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari