亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Flutter如何使用Completer實(shí)現(xiàn)防抖功能

 更新時間:2024年03月12日 16:23:11   作者:盧叁  
防抖是用于確保時間內(nèi)的所有觸發(fā)被合并成單一請求,在Flutter中,我們可以使用Completer 來實(shí)現(xiàn)防抖功能,下面我們就來看看具體實(shí)現(xiàn)方法吧

Flutter中,Completer 可以用來實(shí)現(xiàn)防抖功能。防抖是用于確保時間內(nèi)的所有觸發(fā)被合并成單一請求。對于連續(xù)的事件觸發(fā)(如用戶的鍵盤輸入、按鈕的連續(xù)點(diǎn)擊),只有在指定的延遲時間內(nèi)沒有再次觸發(fā)事件時,才執(zhí)行實(shí)際的操作。

下面是如何使用 Completer 來實(shí)現(xiàn)異步防抖的一個示例,代碼如下:

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));

    // 模擬快速連續(xù)觸發(fā)事件
    debouncer.run(() => print('Action 1'));
    debouncer.run(() => print('Action 2'));
    debouncer.run(() => print('Action 3'));

    // 等待一秒后執(zhí)行
    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 方法接受一個要執(zhí)行的動作,并且確保在連續(xù)調(diào)用時,只有最后一次調(diào)用會在指定的延遲后執(zhí)行。
  • 當(dāng) run 方法被連續(xù)調(diào)用時,它會通過 Completer 取消前一個還未完成的動作,并重新開始計時。
  • 只有在延遲時間過去且沒有新的調(diào)用時,最后一次動作才會執(zhí)行。

這種方法可以有效地限制事件(如用戶輸入、按鈕點(diǎn)擊等)的處理頻率,從而優(yōu)化性能和資源利用。在實(shí)際應(yīng)用中,大家可能需要根據(jù)具體情況調(diào)整延遲時間和處理邏輯。

到此這篇關(guān)于詳解Flutter如何使用Completer實(shí)現(xiàn)防抖功能的文章就介紹到這了,更多相關(guān)Flutter Completer防抖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于android實(shí)現(xiàn)五子棋開發(fā)

    基于android實(shí)現(xiàn)五子棋開發(fā)

    這篇文章主要為大家詳細(xì)介紹了基于android實(shí)現(xiàn)五子棋開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • FFmpeg?音頻可視化解碼流程詳解

    FFmpeg?音頻可視化解碼流程詳解

    這篇文章主要為大家介紹了FFmpeg?音頻可視化解碼流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android Studio配置文件路徑修改的方法

    Android Studio配置文件路徑修改的方法

    這篇文章主要介紹了Android Studio配置文件路徑修改的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 簡單掌握Android Widget桌面小部件的創(chuàng)建步驟

    簡單掌握Android Widget桌面小部件的創(chuàng)建步驟

    這篇文章主要介紹了簡單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術(shù)進(jìn)行開發(fā),需要的朋友可以參考下
    2016-03-03
  • 最新評論