如何在Flutter中创建由大量线条构成的status(progress) bar?

原生无依赖实现方案
这个组件逻辑非常简单,完全不需要第三方库就能快速实现,核心步骤如下:
- 先拆解组件结构:外层是进度条容器,内部包含灰色底的进度轨道、按步骤拆分的等宽分段块、标记当前位置的高亮滑块/圆点,轨道下方对应放置每个步骤的文字标签
- 布局直接用CSS Flex实现:轨道设置
display: flex,每个分段块设置flex: 1就能自动等宽铺满,已完成的分段填充成功色,当前进行中的分段填充主色,未开始的分段保持灰色底即可;高亮滑块用绝对定位,通过left属性控制位置,加transition就能实现平滑滑动的动画效果 - 逻辑部分只需要十几行原生JS:对外暴露一个设置当前进度的方法,传入当前所在步骤/完成百分比,自动计算滑块的偏移位置,给对应分段切换状态类名就完成了
核心代码参考:
<div class="progress-wrapper"> <!-- 进度条主体 --> <div class="progress-track"> <div class="segment done"></div> <div class="segment done"></div> <div class="segment active"></div> <div class="segment"></div> <div class="current-pointer"></div> </div> <!-- 步骤标签 --> <div class="label-group"> <span>提交申请</span> <span>材料审核</span> <span>处理中</span> <span>完成</span> </div> </div>
.progress-track { position: relative; display: flex; width: 100%; height: 6px; border-radius: 3px; background: #e2e8f0; overflow: hidden; } .segment { flex: 1; border-right: 2px solid #fff; } .segment.done { background: #10b981; } .segment.active { background: #2563eb; } .current-pointer { position: absolute; top: 50%; width: 14px; height: 14px; border-radius: 50%; background: #2563eb; transform: translate(-50%, -50%); transition: left .25s ease; /* 动态设置left值即可移动滑块,比如走到第3个分段(共4段)时left设为62.5% */ left: 62.5%; } .label-group { display: flex; justify-content: space-between; margin-top: 10px; font-size: 12px; color: #64748b; }
整套实现(含样式、交互逻辑)代码量不超过120行,没有任何额外依赖,加载速度最快,还能100%按设计稿调整样式,不存在第三方库默认样式改不动的问题。
要不要用第三方库?
没有绝对的优劣,完全看项目场景:
- 如果只是单个页面用到这个进度条,样式固定、后续没有复杂的迭代需求,直接原生写的成本远低于引入第三方库,完全没必要为了一个小组件增加包体积
- 如果你的项目本身已经引入了成套UI组件库,或者后续要做步骤点击跳转、异步加载状态、异常状态提示、多端兼容等复杂交互,用成熟的第三方库效率更高,省掉自己处理边界case、做兼容维护的成本
可选的第三方库推荐
根据项目技术栈选就行:
- React技术栈:如果已经用了Ant Design、MUI这类组件库,直接用内置的Steps/Progress组件就能拼出这个效果,支持自定义分段颜色、节点样式;如果不想引整套UI库,可以选rc-progress这个单功能组件,轻量灵活
- Vue技术栈:直接用Element Plus、Naive UI、Vuetify内置的步骤条/进度条组件即可,开箱即用,配置项足够覆盖这个样式需求
- 无框架/原生JS场景:可以选progressbar.js,gzip后体积不到5KB,支持自定义分段形态、动画效果,没有额外依赖
内容的提问来源于stack exchange,提问作者Milos N.
相关产品推荐
相关产品推荐

