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

相关推荐
程序员老刘4 小时前
Android Studio Quail 4发布,看日志我以为谷歌放弃Flutter了
flutter·android studio·ai编程
andyweike4 小时前
Android Automotive
android
又见情义5 小时前
记一次 RK3568 Android 13 蓝牙反复重启问题的排查与修复
android
Crazy_MT5 小时前
Flutter 本地大模型实战:做一个自然语言记账工具
flutter·llm·ai编程
hai_android5 小时前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
敲代码的瓦龙7 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
Godikov7 小时前
Android 工控终端实战:从秒级卡顿到毫秒响应,SQLite/LitePal 性能优化全记录
android
黑科技iOS上架8 小时前
unity3D 应用AppStore4.3被拒怎么自查
ios·审核·unity3d混淆
星间都市山脉9 小时前
Android16 SystemService.onBootPhase 调用时机
android·java·linux·windows·ubuntu
swithun9 小时前
不用 WebView,我用 Kotlin + Compose Multiplatform 重写 Mermaid,并做了 2048 组对拍
android·开源·kotlin