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

flutter 中间组件自适应宽度

使用Flexible + IntrinsicWidth

Row(children: [Text('第一个text'),Flexible(child: IntrinsicWidth(child: ConstrainedBox(constraints: BoxConstraints(maxWidth: 200), // 最大宽度限制child: Text('中间的text可能很长也可能很短',overflow: TextOverflow.ellipsis,maxLines: 1,),),),),Text('第三个text'),],
)

使用LayoutBuilder + 自定义计算

LayoutBuilder(builder: (context, constraints) {final firstText = '第一个text';final middleText = '中间的text可能很长也可能很短';final thirdText = '第三个text';// 计算文本宽度final textPainter = TextPainter(text: TextSpan(text: middleText),textDirection: TextDirection.ltr,);textPainter.layout();final middleTextWidth = textPainter.width;final maxWidth = 200.0;// 使用实际宽度或最大宽度中的较小值final actualWidth = middleTextWidth < maxWidth ? middleTextWidth : maxWidth;return Row(children: [Text(firstText),SizedBox(width: actualWidth,child: Text(middleText,overflow: TextOverflow.ellipsis,maxLines: 1,),),Text(thirdText),],);},
)

使用CustomMultiChildLayout

CustomMultiChildLayout(delegate: _ThreeTextLayoutDelegate(maxWidth: 200),children: [LayoutId(id: 'first',child: Text('第一个text'),),LayoutId(id: 'middle',child: Text('中间的text可能很长也可能很短',overflow: TextOverflow.ellipsis,maxLines: 1,),),LayoutId(id: 'third',child: Text('第三个text'),),],
)class _ThreeTextLayoutDelegate extends MultiChildLayoutDelegate {final double maxWidth;_ThreeTextLayoutDelegate({required this.maxWidth});@overridevoid performLayout(Size size) {// 获取第一个text的尺寸final firstSize = layoutChild('first', BoxConstraints.loose(size));// 获取第三个text的尺寸final thirdSize = layoutChild('third', BoxConstraints.loose(size));// 计算中间text可用的最大宽度final availableWidth = size.width - firstSize.width - thirdSize.width;// 计算中间text的实际宽度(不超过maxWidth)final middleConstraints = BoxConstraints(maxWidth: availableWidth.clamp(0, maxWidth),minWidth: 0,);final middleSize = layoutChild('middle', middleConstraints);// 布局positionChild('first', Offset.zero);positionChild('middle', Offset(firstSize.width, 0));positionChild('third', Offset(firstSize.width + middleSize.width, 0));}@overridebool shouldRelayout(covariant MultiChildLayoutDelegate oldDelegate) => false;
}

使用StatefulWidget + 动态计算

class AdaptiveTextRow extends StatefulWidget {final String firstText;final String middleText;final String thirdText;final double maxMiddleWidth;const AdaptiveTextRow({super.key,required this.firstText,required this.middleText,required this.thirdText,this.maxMiddleWidth = 200,});@overrideState<AdaptiveTextRow> createState() => _AdaptiveTextRowState();
}class _AdaptiveTextRowState extends State<AdaptiveTextRow> {double? middleTextWidth;@overridevoid initState() {super.initState();WidgetsBinding.instance.addPostFrameCallback((_) {_calculateMiddleTextWidth();});}void _calculateMiddleTextWidth() {final textPainter = TextPainter(text: TextSpan(text: widget.middleText),textDirection: TextDirection.ltr,);textPainter.layout();setState(() {middleTextWidth = textPainter.width;});}@overrideWidget build(BuildContext context) {if (middleTextWidth == null) {return Row(children: [Text(widget.firstText),Flexible(child: Text(widget.middleText,overflow: TextOverflow.ellipsis,maxLines: 1,),),Text(widget.thirdText),],);}final actualWidth = middleTextWidth! < widget.maxMiddleWidth ? middleTextWidth! : widget.maxMiddleWidth;return Row(children: [Text(widget.firstText),SizedBox(width: actualWidth,child: Text(widget.middleText,overflow: TextOverflow.ellipsis,maxLines: 1,),),Text(widget.thirdText),],);}
}// 使用方式
AdaptiveTextRow(firstText: '第一个text',middleText: '中间的text可能很长也可能很短',thirdText: '第三个text',maxMiddleWidth: 200,
)

文章转载自:

http://ECSPzYHQ.fmswb.cn
http://i8cQIK2I.fmswb.cn
http://O3DIvHHu.fmswb.cn
http://lcyMnKFL.fmswb.cn
http://kdjyffOl.fmswb.cn
http://AdjS5woY.fmswb.cn
http://i6Jt4XAc.fmswb.cn
http://hVUI3BIJ.fmswb.cn
http://7xxJFjsI.fmswb.cn
http://kUAP1SKF.fmswb.cn
http://KDm98Jbn.fmswb.cn
http://oPPDsrdr.fmswb.cn
http://x0P5R4dD.fmswb.cn
http://BGi1Itnd.fmswb.cn
http://DxKM1fgt.fmswb.cn
http://IIWRZHaD.fmswb.cn
http://ou6tnsIg.fmswb.cn
http://tow2q7j6.fmswb.cn
http://KxJNhbJa.fmswb.cn
http://QOnzwJar.fmswb.cn
http://i1vCpRjR.fmswb.cn
http://2jy5gabB.fmswb.cn
http://eRBLsMt8.fmswb.cn
http://GdoJPZ3I.fmswb.cn
http://n7U87sKp.fmswb.cn
http://9zal7ipE.fmswb.cn
http://JcxTQcPY.fmswb.cn
http://A2NZlk4F.fmswb.cn
http://GoBnNafh.fmswb.cn
http://zW7oSTAi.fmswb.cn
http://www.dtcms.com/a/364836.html

相关文章:

  • 从在线工具到代码库:图表设计工具挑选指南
  • uniapp 开发上架 iOS App全流程
  • Spring Boot 事务失效的八大原因及解决方案详解
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证
  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 【串口助手】串口调试助手LTSerialTool v3.12.0发布
  • 打靶日记-SQLi-LABS(二)
  • LeetCode 3132.找出与数组相加的整数2
  • 金融行业数智化转型:如何用企业微信AI实现高效内部协作与外部服务?
  • MCP(Model Context Protocol)介绍
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)
  • Photoshop - Photoshop 触控手势
  • 网络安全A模块专项练习任务十一解析
  • Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • nestjs 阿里云服务端签名
  • Spring boot3.x整合mybatis-plus踩坑记录
  • Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
  • Jenkins-Ansible部署discuz论坛
  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • 嵌入式高薪岗位有哪些?
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • 【10月优质EI会议合集|高录用】能源、机电一体化、材料、计算机、环境、电力、可再生资源、遥感、通讯、智慧交通...
  • SCN随机配置网络时间序列预测Matlab实现
  • 执行一条select语句期间发生了什么?
  • Java设计模式之结构型—代理模式
  • 从Java全栈到前端框架:一次真实的面试对话