详解Flutter如何使用Completer实现防抖功能
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
在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应用编写时Fragment的生命周期问题
这篇文章主要介绍了Android应用编写时Fragment的生命周期问题探究,resumed和paused以及stoped三种状态的控制需要熟练掌握,需要的朋友可以参考下2016-02-02Android中TextView和ImageView实现倾斜效果
这篇文章主要为大家详细介绍了Android中TextView和ImageView实现倾斜效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-08-08Android中butterknife的使用与自动化查找组件插件详解
这篇文章主要给大家介绍了关于Android中butterknife的使用与自动化查找组件插件的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧2019-10-10
最新评论