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)),
        ],
      ),
    );
  }
}
相关推荐
Zacks_xdc11 分钟前
【全栈】云服务器安装 MySQL + Next.js 连接完整 Demo
服务器·javascript·mysql·阿里云·nextjs·云服务器
神の愛16 分钟前
java的Aop
java·开发语言
左左右右左右摇晃27 分钟前
ConcurrentHashMap ——put + get
java·开发语言·笔记
今夕资源网36 分钟前
零基础 Python 环境搭建工具 一键安装 Python 环境自动配置 升级 pip、setuptools、wheel
开发语言·python·pip·环境变量·python环境变量·python自动安装
JosieBook43 分钟前
【C#】C# 访问修饰符与类修饰符总结大全
前端·javascript·c#
小CC吃豆子1 小时前
C++ 继承
开发语言·c++
Derrick__11 小时前
Scrapling 爬取豆瓣电影Top250
开发语言·python·网络爬虫·豆瓣·scrapling
华洛1 小时前
聊聊我逃离前端开发前的思考
前端·javascript·vue.js
serve the people1 小时前
ACME 协议流程与AllinSSL 的关系(一)
开发语言
2401_835792541 小时前
Java复习上
java·开发语言·python