You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现:为设备状态栏添加活动/进度指示器

替代方案推荐

嘿,我刚好有几个靠谱的方案能帮你解决这个问题,不用再纠结那个过时且只支持iOS的包啦!

方案1:用维护活跃的第三方包快速实现

推荐flutter_statusbar_progress这个包,它支持iOS和Android双平台,更新也比较及时,能直接实现类似Telegram X的状态栏进度指示器效果。

  • 第一步,在pubspec.yaml里添加依赖:
dependencies:
  flutter_statusbar_progress: ^最新版本号 # 记得换成当前最新版本
  • 然后在代码里调用就行:
import 'package:flutter_statusbar_progress/flutter_statusbar_progress.dart';

// 显示进度,进度值范围是0到1(比如0.5就是50%)
FlutterStatusbarProgress.setProgress(0.5);

// 进度完成后隐藏指示器
FlutterStatusbarProgress.hideProgress();

还能自定义进度条颜色,比如改成你项目的主题色:

FlutterStatusbarProgress.setProgress(0.5, color: Colors.yellow);

方案2:自定义Overlay实现(无第三方依赖,完全可控)

如果不想依赖第三方包,也可以用Flutter自带的Overlay自己实现,样式完全由你说了算:

  1. 先写两个全局方法来管理进度条的显示和隐藏:
OverlayEntry? _statusBarProgressOverlay;

void showStatusBarProgress(BuildContext context, double progress) {
  // 如果已有进度条,先移除旧的
  _statusBarProgressOverlay?.remove();

  _statusBarProgressOverlay = OverlayEntry(
    builder: (context) => Positioned(
      top: 0,
      left: 0,
      right: 0,
      // 高度设为状态栏的高度
      height: MediaQuery.of(context).padding.top,
      child: Container(
        color: Colors.transparent,
        // 把进度条贴在状态栏顶部
        child: Align(
          alignment: Alignment.topLeft,
          child: Container(
            height: 2, // 进度条高度
            width: MediaQuery.of(context).size.width * progress,
            color: Colors.blue, // 进度条颜色
          ),
        ),
      ),
    ),
  );

  // 插入到Overlay中显示
  Overlay.of(context)?.insert(_statusBarProgressOverlay!);
}

void hideStatusBarProgress() {
  _statusBarProgressOverlay?.remove();
  _statusBarProgressOverlay = null;
}
  1. 使用的时候直接调用:
// 显示50%的进度
showStatusBarProgress(context, 0.5);

// 操作完成后隐藏
hideStatusBarProgress();

这种方式的好处是你可以随便改样式——比如把进度条改成渐变的、调整高度、加动画效果,完全贴合你的项目需求。

方案3:结合系统UI设置和页面布局

如果想要进度条和状态栏融合得更自然,还可以把状态栏设为透明,然后在页面顶部放进度条,视觉上就像在状态栏里一样:

// 先设置状态栏为透明
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
  statusBarColor: Colors.transparent,
  statusBarIconBrightness: Brightness.dark, // 根据进度条颜色调整图标亮度
));

// 然后在页面布局里添加进度条
Scaffold(
  body: Column(
    children: [
      Container(
        // 高度是状态栏高度加进度条高度
        height: MediaQuery.of(context).padding.top + 2,
        child: Align(
          alignment: Alignment.topLeft,
          child: Container(
            height: 2,
            width: MediaQuery.of(context).size.width * 0.5,
            color: Colors.blue,
          ),
        ),
      ),
      // 页面的其他内容
      Expanded(
        child: Center(child: Text('页面内容')),
      ),
    ],
  ),
);

这种方式需要注意适配不同设备的状态栏高度,用MediaQuery.of(context).padding.top就能搞定所有机型啦。

内容的提问来源于stack exchange,提问作者Rehmat Singh Gill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:42:44