Flutter防抖操作插件dart_debouncer的使用
Flutter防抖操作插件dart_debouncer的使用
Dart debouncer
dart_debouncer
是一个用于在Dart中创建防抖功能的包,它支持多实例防抖。该包不采用单例模式,为处理用户交互(如按钮点击或文本输入更改)提供了一种便捷的方法,以增强用户体验,避免意外操作、不必要的逻辑执行或频繁更新。
如何使用
实例化Debouncer类
首先,需要实例化一个 Debouncer
类:
final Debouncer debouncer = Debouncer();
然后,在任何地方使用它:
TextFormField(
...
onChanged: (final String text) {
debouncer.resetDebounce(() {
// Do something with the text
});
},
),
清除防抖定时器
使用完防抖计时器后不要忘记清除它:
debouncer.dispose();
⚠️ 注意:调用 dispose
并不是必须的。但如果你不清除它,即使你不再处于放置它的上下文中,函数仍然会被执行。所以如果例如防抖器内的函数使用了已经不存在的依赖项,你将收到错误。这基本上会取消防抖计时器和执行。
其他有用的功能
添加在防抖执行前运行的函数
你可以添加任意数量的函数。它们将按照添加的顺序执行。
debouncer.addOnInitFunction(() {
print('start 1');
});
debouncer.addOnInitFunction(() {
print('start 2');
});
添加在防抖执行后运行的函数
同样可以添加任意数量的函数,按添加顺序执行。
debouncer.addOnEndFunction(() {
print('end 1');
});
debouncer.addOnEndFunction(() {
print('end 2');
});
确保一个函数不会与防抖函数并行运行
如果你想运行一个函数,并确保它不会与防抖器中的异步执行函数同时运行,可以使用 guaranteedExecutionAfterDebounceFinished
方法。
final debouncer = Debouncer(timerDuration: Duration(seconds: 1));
debouncer.resetDebounce(() async {
await Future.delayed(Duration(seconds: 1));
print('Done!');
});
// Will not execute until debounce function is running. Will wait it finish first
debouncer.guaranteedExecutionAfterDebounceFinished(() {
print('Only runned after 2 seconds');
});
print(debouncer.isTimerActive());
检查防抖函数是否正在运行
final debouncer = Debouncer(timerDuration: Duration(seconds: 1));
final bool isDebouncerRunning = debouncer.isTimerActive();
print(isDebouncerRunning);
更改防抖持续时间
// The debouncer time is 1 sec
final debouncer = Debouncer(timerDuration: Duration(seconds: 1));
// Now the timer is 3 secs
debouncer.updateTimer(Duration(seconds: 3));
持续时间扩展方法
提供了 num
的扩展方法,使指定持续时间更加容易。例如:2.seconds
,0.1.minutes
或 300.ms
。
示例代码
下面是一个完整的示例,展示了如何在Flutter应用中使用 dart_debouncer
包:
import 'package:dart_debouncer/dart_debouncer.dart';
import 'package:flutter/material.dart';
class Example extends StatefulWidget {
const Example({super.key});
@override
State<Example> createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
final Debouncer debouncer = Debouncer(
timerDuration: const Duration(seconds: 1),
);
final emailEC = TextEditingController();
String typedText = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(typedText),
),
body: Center(
child: TextField(
controller: emailEC,
onChanged: (value) {
debouncer.resetDebounce(() {
/// Will only set value after 1 second of no typing
setState(() {
typedText = value;
});
});
},
),
),
);
}
@override
void dispose() {
debouncer.dispose();
emailEC.dispose();
super.dispose();
}
}
这个例子展示了一个简单的Flutter页面,其中包含一个文本字段。当用户停止输入1秒后,typedText
将被设置为当前文本字段的值。此外,我们在 dispose
方法中清理了 Debouncer
和 TextEditingController
,以确保没有内存泄漏。
更多关于Flutter防抖操作插件dart_debouncer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter防抖操作插件dart_debouncer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用dart_debouncer
插件来实现防抖操作的代码案例。dart_debouncer
是一个用于防止多次快速触发事件的插件,它可以帮助你在Flutter应用中实现高效的防抖功能。
首先,确保你已经在你的pubspec.yaml
文件中添加了dart_debouncer
依赖:
dependencies:
flutter:
sdk: flutter
dart_debouncer: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们来看一个具体的代码案例。假设我们有一个文本输入框,当用户在输入框中输入文字时,我们不希望每次输入都触发一个网络请求或昂贵的操作,而是希望在一定时间间隔内只触发一次。这时,我们可以使用dart_debouncer
来实现。
import 'package:flutter/material.dart';
import 'package:dart_debouncer/dart_debouncer.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DebouncerExample(),
);
}
}
class DebouncerExample extends StatefulWidget {
@override
_DebouncerExampleState createState() => _DebouncerExampleState();
}
class _DebouncerExampleState extends State<DebouncerExample> {
final Debouncer<String> debouncer = Debouncer<String>(wait: 2000); // 设置防抖时间为2000毫秒
String inputText = '';
void handleTextChanged(String text) {
debouncer.call(() {
// 这里是防抖后的回调,只会在最后一次输入后的2000毫秒内调用一次
print('Debounced text: $text');
// 你可以在这里执行网络请求或其他昂贵的操作
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Debouncer Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
decoration: InputDecoration(labelText: 'Enter text'),
onChanged: handleTextChanged,
),
SizedBox(height: 16),
Text('Current input: $inputText'),
],
),
),
);
}
}
在这个示例中,我们创建了一个Debouncer
实例,并设置了2000毫秒的防抖时间。当用户在TextField
中输入文本时,handleTextChanged
方法会被调用。在这个方法中,我们使用debouncer.call
来包装一个回调,这个回调只会在最后一次输入后的2000毫秒内被调用一次。
这样,你就可以有效地防止因用户快速输入而引发的多次昂贵操作了。
希望这个代码案例能帮助你理解如何在Flutter中使用dart_debouncer
插件来实现防抖操作。