Flutter 队列任务(支持队列暂停 & 继续...)

最近 Flutter 重构原生首页,大部分的 App 随着产品迭代都会在首页加各自弹窗,比如广告弹窗,推送弹窗,版本更新提示等等。在这种场景下不得不用队列去管理弹窗,让弹窗按顺序去一一弹出。效果如下~

Use

less 复制代码
showDialog(
    BuildContext context,
    String title,
  ) {
    queue.add(
      () => twShowAnimationDialog(
        context: context,
        transitionType: TwTransitionType.inFromBottom,
        builder: (ctx) {
          return Material(
            color: Colors.transparent,
            child: Center(
              child: Container(
                height: 200,
                width: 200,
                color: TWTool.randomColor(),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      title,
                      style: const TextStyle(
                        fontSize: 12,
                      ),
                    ),
                    ElevatedButton(
                      child: const Text(
                        'open',
                      ),
                      onPressed: () {
                        showDialog(context, TWTool.randomColor().toString());
                      },
                    ),
                    ElevatedButton(
                      child: const Text('Close'),
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                    ),
                  ],
                ),
              ),
            ),
          );
        },
      ),
    );
  }

Question?

遇到另外一个场景,有些只能在首页弹窗的组件,进入子页面也会弹出,这不是我们产品想要的。

遇到这个问题我也提了个问题,延迟的弹窗怎么限制不再第二页面弹出? 传送门,不过并不是我想要答案。

🤔 如果队列组件支持暂停和继续,那结合页面路由管理,只要在进入第二个页面暂停队列,回到首页继续队列,那是不是就可以?

Just do it!

一开始采用 dart_queue 这个组件管理。不过遇到 cancel 后它抛出异常后,就不能给继续给队列添加任务了,我也给原作者提了 pr ,但作者好像不怎么维护了,其他大佬提 pr 没有得到回复。因此决定结合自己场景并稍微修改它。

1、Support set task priority

dart 复制代码
final queue = TWQueue();
final t1 = 'testQueue4-1';
final t2 = 'testQueue4-2';
final t3 = 'testQueue4-3';
final t4 = 'testQueue4-4';
final results = <String?>[];
//Queue up a future and await its result
queue.add(
  tag: t1,
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t1);
    print('res1 = $t1');
  },
);
queue.add(
  tag: t2,
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t2);
    print('res2 = $t2');
  },
);

queue.add(
  tag: t3,
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t3);
    print('res3 = $t3');
  },
  priority: TWPriority.low,
);

queue.add(
  tag: t4,
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t4);
    print('res4 = $t4');
  },
  priority: TWPriority.high,
);
await queue.onComplete;
print('results = $results');

2、Support remove task

📢 正在执行的队列任务是无法删除~

ini 复制代码
final queue = TWQueue();
final t1 = 'testQueue4-1';
final t2 = 'testQueue4-2';
final t3 = 'testQueue4-3';
final t4 = 'testQueue4-4';
final results = <String?>[];
unawaited(
  queue.add(
    () async {
      await Future.delayed(const Duration(seconds: 1));
      results.add(t1);
    },
    tag: t1,
  ),
);
unawaited(
  queue.add(
    () async {
      await Future.delayed(const Duration(seconds: 1));
      results.add(t2);
    },
    tag: t2,
  ),
);

unawaited(
  queue.add(
    () async {
      await Future.delayed(const Duration(seconds: 1));
      results.add(t3);
    },
    tag: t3,
  ),
);

unawaited(
  queue.add(
    () async {
      await Future.delayed(const Duration(seconds: 1));
      results.add(t4);
    },
    tag: t4,
  ),
);
// remove t2 and t4
queue.remove(t2);
queue.remove(t4);
await queue.onComplete;
// log: results [testQueue4-1, testQueue4-3]
print('results $results');

3、Support pause and resume task

📢 正在执行的队列任务是无法暂停~

ini 复制代码
final queue = TWQueue();
final results = <String?>[];
final t1 = 'testQueue6-1';
final t2 = 'testQueue6-2';
final t3 = 'testQueue6-3';
final t4 = 'testQueue6-4';

await queue.add(
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t1);
  },
);
await queue.add(
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t2);
  },
);
queue.pause();
unawaited(queue.add(
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t3);
  },
));
unawaited(queue.add(
  () async {
    await Future.delayed(const Duration(seconds: 1));
    results.add(t4);
  },
));
Future.delayed(const Duration(seconds: 1), () {
  // delayed results [testQueue4-1, testQueue4-2]
  print('delayed results $results');
  queue.resume();
});
await queue.onComplete;
// onComplete results [testQueue4-1, testQueue4-2, testQueue4-3, testQueue4-4]
print('onComplete results $results');

项目中效果

Last

调整后已上传 pub,使用如下

yaml 复制代码
dependencies:
  tw_queue: latest_version

tw_queue 地址 传送门, 如果你觉得对你有帮助,请不吝给个 Star 。如果有问题,也请大佬们指点 ~ 感谢!

Thx

相关推荐
骑驴看星星a9 分钟前
【Three.js--manual script】4.光照
android·开发语言·javascript
猫林老师4 小时前
Flutter for HarmonyOS 开发指南(一):环境搭建与项目创建
flutter·华为·harmonyos
Digitally5 小时前
如何在Mac上同步iPhone短信
macos·ios·iphone
TDengine (老段)6 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
会跑的兔子7 小时前
Android 16 Kotlin协程 第一部分
android·开发语言·kotlin
Meteors.8 小时前
安卓进阶——OpenGL ES
android
2501_915106328 小时前
App HTTPS 抓包 工程化排查与工具组合实战
网络协议·ios·小程序·https·uni-app·php·iphone
椰羊sqrt10 小时前
CVE-2025-4334 深度分析:WordPress wp-registration 插件权限提升漏洞
android·开发语言·okhttp·网络安全
2501_9160088910 小时前
金融类 App 加密加固方法,多工具组合的工程化实践(金融级别/IPA 加固/无源码落地/Ipa Guard + 流水线)
android·ios·金融·小程序·uni-app·iphone·webview
sun00770010 小时前
Android设备推送traceroute命令
android