Flutter中防抖动和节流策略

什么是防抖和节流?

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象
是应对频繁触发事件的优化方案。

防抖(debounce)

防抖就是防止抖动,避免事件的重复触发。
防抖可以概括为触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。
n 秒后执行该事件,若在n秒后被重复触发,则重新计时
简单的说,如果某一事件被连续快速地触发多次,只会执行最后那一次。

  • 使用场景

· input 搜索录入,用户不断录入值
· window触发resize事件
· mousemove 鼠标滑动事件
· scroll滚动条滑动请求、上拉触底加载更多
· 表单验证,按钮的提交事件

节流(throttle)

节流就是减少流量,将频繁触发的事件减少,并每隔一段时间执行。会控制事件触发的频率。所以节流会稀释函数的执行频率。
n 秒内只运行一次,若在n秒内重复触发,只有一次生效。
如果连续快速地触发多次,在规定的时间内,只触发一次。如限制1s,则1s内只执行一次,无论怎样,都在会1s内执行相应的操作。

  • 使用场景

· 获取验证码
·鼠标不断点击触发,mousedown(规定时间内只触发一次)
·mousemove 鼠标滑动事件
·滚动条滑动请求、上拉触底加载更多
·搜索、提交等按钮功能

防抖和节流之间的差别:

相同点: 目的都是,降低回调函数的执行频率,节省计算资源

不同点:
· 防抖,是在一段连续操作结束之后,处理回调
· 节流,是在一段连续操作中,每一段时间只执行一次,在频率较高的事件中使用来提高性能。
·防抖用于无法预知的用户主动行为,如用户输入内容去服务端动态搜索结果。用户打字的速度等是无法预知的,具有非规律性。
·节流可用于一些非用户主动行为或者可预知的用户主动行为,如用户滑动商品橱窗时发送埋点请求、滑动固定的高度是已知的逻辑,具有规律性。
·防抖是关注于最后一次的事件触发,而节流则是在规定的时间里只执行一次。
·防抖是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行

  • 防抖以一个实时搜索框为例 当用户在输入框中进行实时搜索时,频繁调用接口可能会导致性能问题和不必要的网络请求。为了优化这种情况,通常可以使用防抖动策略来减少接口调用的频率。

使用 flutter_hooks 包可以更容易地实现防抖动功能。

flutter_hooks: ^0.18.0
dio: ^5.0.2

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:dio/dio.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Debounced Search'),
        ),
        body: SearchScreen(),
      ),
    );
  }
}

class SearchScreen extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final searchController = useTextEditingController();
    final debouncedSearch = useMemoized(() {
      return _DebouncedSearch(duration: Duration(milliseconds: 500));
    });

    useEffect(() {
      void listener() {
        debouncedSearch.run(() {
          // 这里调用接口
          _performSearch(searchController.text);
        });
      }

      searchController.addListener(listener);
      return () => searchController.removeListener(listener);
    }, [searchController]);

    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Column(
        children: [
          TextField(
            controller: searchController,
            decoration: InputDecoration(
              hintText: 'Search...',
            ),
          ),
          Expanded(
            child: ListView(
              children: [
                // 搜索结果展示
              ],
            ),
          ),
        ],
      ),
    );
  }

  void _performSearch(String query) async {
    if (query.isEmpty) return;

    try {
      // 模拟调用接口
      print('Searching for $query');
      // 在这里用 Dio 或其他包实际调用接口
      var response = await Dio().get('https://api.example.com/search', queryParameters: {'q': query});
      print(response.data);
    } catch (e) {
      print('Search error: $e');
    }
  }
}

class _DebouncedSearch {
  final Duration duration;
  Timer? _timer;

  _DebouncedSearch({required this.duration});

  void run(void Function() action) {
    _timer?.cancel();
    _timer = Timer(duration, action);
  }
}

相关推荐

  1. Flutter抖动节流策略

    2024-06-09 08:50:05       12 阅读
  2. 抖(Debounce)节流(Throttle)

    2024-06-09 08:50:05       15 阅读
  3. 节流】VueReact当中的节流处理

    2024-06-09 08:50:05       30 阅读
  4. 抖与节流:Vue的优化技巧

    2024-06-09 08:50:05       51 阅读
  5. 抖函数,节流函数

    2024-06-09 08:50:05       34 阅读
  6. lodash库(抖、节流

    2024-06-09 08:50:05       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 08:50:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 08:50:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 08:50:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 08:50:05       20 阅读

热门阅读

  1. outlook邮件使用技巧

    2024-06-09 08:50:05       11 阅读
  2. 新手指南:如何使用Python快速上手深度学习

    2024-06-09 08:50:05       13 阅读
  3. Unity与前端交互:深度解析与实战指南

    2024-06-09 08:50:05       12 阅读
  4. windows下的which命令

    2024-06-09 08:50:05       7 阅读
  5. PHP基础

    2024-06-09 08:50:05       8 阅读
  6. 使用RedissonClient的管道模式批量查询key

    2024-06-09 08:50:05       7 阅读
  7. iOS中常用的一些宏以及用法

    2024-06-09 08:50:05       7 阅读
  8. Go 语言的 copy

    2024-06-09 08:50:05       9 阅读
  9. 【智驾硬件相关缩写词】

    2024-06-09 08:50:05       10 阅读
  10. 计算机网络期末复习

    2024-06-09 08:50:05       8 阅读
  11. 栈-20.有效的括号

    2024-06-09 08:50:05       6 阅读
  12. 开源目标检测数据集汇总

    2024-06-09 08:50:05       11 阅读