详解Flutter如何使用Completer实现防抖功能

 更新时间:2024年03月12日 16:23:11   作者:卢叁  
防抖是用于确保时间内的所有触发被合并成单一请求,在Flutter中,我们可以使用Completer 来实现防抖功能,下面我们就来看看具体实现方法吧

Flutter中,Completer 可以用来实现防抖功能。防抖是用于确保时间内的所有触发被合并成单一请求。对于连续的事件触发(如用户的键盘输入、按钮的连续点击),只有在指定的延迟时间内没有再次触发事件时,才执行实际的操作。

下面是如何使用 Completer 来实现异步防抖的一个示例,代码如下:

import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Drag to Sort',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> _items = List<String>.generate(10, (i) => 'Item $i');
  bool _isReorderable = false;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    var debouncer = Debouncer(delay: Duration(seconds: 1));

    // 模拟快速连续触发事件
    debouncer.run(() => print('Action 1'));
    debouncer.run(() => print('Action 2'));
    debouncer.run(() => print('Action 3'));

    // 等待一秒后执行
    Future.delayed(Duration(seconds: 2), () {
      debouncer.run(() => print('Action after delay'));
    });

  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      //  backgroundColor: Colors.blueAccent,
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Column(children: [
        _buildContainer(Colors.lightBlue,const Flexible(
            child: Text("这是一个项目",maxLines: 1,overflow: TextOverflow.ellipsis,))),
        _buildContainer(Colors.red, const Flexible(
            fit: FlexFit.tight,
            child: Text("这是一个项目",maxLines: 1,overflow: TextOverflow.ellipsis,))),
        _buildContainer(Colors.purple,  Flexible(
            fit: FlexFit.tight,
            child: Text("这是一个项目" * 6,maxLines: 1,overflow: TextOverflow.ellipsis,))),
        _buildContainer(Colors.blue,  Expanded(
            child: Text("这是一个项目" * 6,maxLines: 1,overflow: TextOverflow.ellipsis,))),

      ],),
    );
  }

  Container _buildContainer(Color color,Widget child) {
    return Container(
      height: 56,
      color: color,
      child: Row(
        children: [
          const SizedBox(width:16),
          const Text("来源:"),
          child,
          const SizedBox(width: 8),
          Container(
            padding: EdgeInsets.all(5),
            decoration: const BoxDecoration(
                color: Colors.cyan,
                borderRadius: BorderRadius.all(Radius.circular(6))
            ),
            child: Text("项目"),
          ),
          const SizedBox(width:16),
        ],
      ),
    );
  }
}

class Debouncer {
  final Duration delay;
  Completer? _lastCompleter;
  Timer? _timer;

  Debouncer({required this.delay});

  void run(Function action) {
    // 如果之前的操作还没有完成,取消它
    if (_lastCompleter != null && !_lastCompleter!.isCompleted) {
      _lastCompleter!.completeError('Cancelled');
    }

    _lastCompleter = Completer();

    // 重置计时器
    _timer?.cancel();
    _timer = Timer(delay, () {
      action();
      _lastCompleter!.complete();
    });

    // 处理取消操作
    _lastCompleter!.future.catchError((error) {
      print('操作被取消');
    });
  }
}

打印如下:

在这个示例中:

  • Debouncer 类包含了防抖逻辑。run 方法接受一个要执行的动作,并且确保在连续调用时,只有最后一次调用会在指定的延迟后执行。
  • run 方法被连续调用时,它会通过 Completer 取消前一个还未完成的动作,并重新开始计时。
  • 只有在延迟时间过去且没有新的调用时,最后一次动作才会执行。

这种方法可以有效地限制事件(如用户输入、按钮点击等)的处理频率,从而优化性能和资源利用。在实际应用中,大家可能需要根据具体情况调整延迟时间和处理逻辑。

到此这篇关于详解Flutter如何使用Completer实现防抖功能的文章就介绍到这了,更多相关Flutter Completer防抖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 记录Android studio JNI开发的三种方式(推荐)

    记录Android studio JNI开发的三种方式(推荐)

    JNI (Java Native Interface)是一套编程接口,用来实现Java代码和其他语言(c、C++或汇编)进行交互。下面通过本文给大家讲解Android studio JNI开发的三种方式,需要的朋友参考下吧
    2017-12-12
  • Android自定义PopupWindow小案例

    Android自定义PopupWindow小案例

    这篇文章主要为大家详细介绍了Android自定义PopupWindow小案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android集成Unity的两种方案

    Android集成Unity的两种方案

    现在市面上的形形色色Android客户端,为了更优的用户体验,我们开发的上游产品和交互往往会在界面里设计很多动效,传统的一页页的静态展示页面已经不足以满足用户的审美需求了,本文将给大家分享Android集成Unity的两种方案,感兴趣的朋友可以参考下
    2024-05-05
  • Android客户端与服务端交互

    Android客户端与服务端交互

    这篇文章主要为大家详细介绍了Android客户端与服务端交互之登陆示例,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Android 中图片和按钮按下状态变化实例代码解析

    Android 中图片和按钮按下状态变化实例代码解析

    这篇文章通过实例代码给大家总结了android 中图片和按钮按下状态变化问题,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-06-06
  • Android设计模式系列之工厂方法模式

    Android设计模式系列之工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式。接下来通过本文给大家介绍Android设计模式系列之工厂方法模式,感兴趣的朋友一起学习吧
    2016-09-09
  • 基于Flutter开发一个图片缓存清理插件

    基于Flutter开发一个图片缓存清理插件

    在flutter开发中,当App项目内存吃紧时,页面中如果图片很多时需要及时清理,本文小编就和大家分享一下如何开发一个图片缓存清理插件吧
    2025-06-06
  • android downsample降低音频采样频率代码

    android downsample降低音频采样频率代码

    这篇文章主要介绍了android downsample降低音频采样频率代码,需要的朋友可以参考下
    2014-02-02
  • Android 带清除功能的输入框控件实例详解

    Android 带清除功能的输入框控件实例详解

    这篇文章主要介绍了Android 带清除功能的输入框控件实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • Android编程中常用适配器及自定义适配器用法实例分析

    Android编程中常用适配器及自定义适配器用法实例分析

    这篇文章主要介绍了Android编程中常用适配器及自定义适配器用法,结合实例形式较为详细的分析了Android中适配器的概念、功能及自定义适配器的相关使用技巧,需要的朋友可以参考下
    2015-11-11

最新评论