当前位置: 首页 > news >正文

Flutter:步骤条组件

在这里插入图片描述

组件封装

import 'package:flutter/material.dart';class SubscribeStepWidget extends StatelessWidget {final List<Map<String, dynamic>> steps;final int current;final Axis axis;final Color? themeColor;const SubscribeStepWidget({Key? key,required this.steps,required this.current,this.axis = Axis.vertical, // 默认竖向this.themeColor,}) : super(key: key);@overrideWidget build(BuildContext context) {if (axis == Axis.horizontal) {// 横向略return Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: _buildHorizontalSteps(),);}// 竖向return Column(crossAxisAlignment: CrossAxisAlignment.start,children: _buildVerticalSteps(context),);}List<Widget> _buildVerticalSteps(BuildContext context) {final Color mainColor = themeColor ?? Colors.blue;List<Widget> widgets = [];for (int i = 0; i < steps.length; i++) {final step = steps[i];final isActive = i + 1 == current;final isFinished = i + 1 < current;widgets.add(IntrinsicHeight(child: Row(crossAxisAlignment: CrossAxisAlignment.start,children: [// 步骤圆圈和竖线Column(children: [Container(width: 20,height: 20,alignment: Alignment.center,decoration: BoxDecoration(color: isActive? mainColor: isFinished? mainColor.withOpacity(0.3): Colors.white,border: Border.all(color: isActive? mainColor: isFinished? mainColor.withOpacity(0.3): Colors.grey,width: 2,),shape: BoxShape.circle,),child: Center(child: isFinished? Icon(Icons.check, size: 16, color: Colors.white): Text('${step['index']}',style: TextStyle(color: isActive? Colors.white: isFinished? Colors.white: Colors.grey,fontWeight: FontWeight.bold,),),),),// 竖线自适应if (i != steps.length - 1)Expanded(child: Container(width: 2,color: isFinished || isActive? mainColor.withOpacity(0.3): Colors.grey[300],),),],),const SizedBox(width: 12),// 标题和内容Expanded(child: Container(padding: const EdgeInsets.only(bottom: 20),child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Text(step['title'] ?? '',style: TextStyle(fontSize: 16,fontWeight: isActive ? FontWeight.bold : FontWeight.normal,color: isActive? mainColor: Colors.black87,),),if (step['desc'] != null)Padding(padding: const EdgeInsets.only(top: 4, bottom: 8),child: Text(step['desc'],style: TextStyle(fontSize: 14,color: Colors.grey[600],),maxLines: 2,overflow: TextOverflow.ellipsis,),),if (step['time'] != null)Text(step['time'],style: TextStyle(fontSize: 12,color: Colors.grey[400],),),],),),),],),),);}return widgets;}// 横向略(如需可补充)List<Widget> _buildHorizontalSteps() => [];
}

调用

  // 当前周期int current = 2;List<Map<String, dynamic>> timeList = [{'index': 1,'title': '项目预热','desc': '阶段1简介','time': '2025.03.20 22:25:26',},{'index': 2,'title': '开始申购','desc': '阶段2简介','time': '2025.03.20 22:25:26',},{'index': 3,'title': '结束申购','desc': '阶段3简介','time': '2025.03.20 22:25:26',},{'index': 4,'title': '公布结果','desc': '阶段4简介','time': '2025.03.20 22:25:26',},];SubscribeStepWidget(steps: controller.timeList,current: controller.current,axis: Axis.vertical, // 或 Axis.verticalthemeColor: AppTheme.colorGreen,
),

相关文章:

  • Flutter项目编译到鸿蒙模拟器报错
  • Flutter Android打包和发布Build APK
  • 国产数据库StarRocks在数栈轻量化数据开发的全流程实践
  • 【论文解读】OpenR:让大模型“深思熟虑”的开源框架
  • 苹果WWDC 2025 技术趋势分析
  • 【王阳明代数集合论基础】情感分析之句子的基本结构
  • 通过SMS凭据管理系统,实现数据库密码、服务器密码、Token等机密信息的临时授权和安全合规使用
  • 一名高级运维工程师,一台新服务器,安装windows系统后,在网络攻防(护网行动)形式下,应该怎么做安全加固?
  • 中小企业服务器低成本的防勒索工具:RDM防勒索
  • MAC无法 ping 通github 系列主页
  • 自己的电脑搭建外网访问网站服务器的步骤
  • Java SE(13)——工具类
  • 进程控制
  • 扩展模块--QWebEngine功能及架构解析
  • 组件化 websocket
  • 基于Netty的UDPServer端和Client端解决正向隔离网闸数据透传问题
  • 在正则表达式中语法 (?P<名字>内容)
  • 2025.6.12 【校内 NOI 训练赛】记录(集训队互测选做)
  • 计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)
  • 如何将视频从 iPhone 传输到 HP 笔记本电脑
  • 可靠的政府网站建设企业/百度推广官网首页
  • 郑州网站开发公司电话/给公司做网站要多少钱
  • 用虚拟机做服务器搭建网站/哪些平台可以发布软文
  • 做网站的视频的软件 cs/泉州seo培训
  • 做网站的论坛/网站排行
  • 可以做调查问卷的网站/挖掘关键词工具