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

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://www.xdnf.cn/news/19847.html

相关文章:

  • 硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器
  • 深入解析MongoDB内部架构设计
  • 深度学习-----简单入门卷积神经网络CNN的全流程
  • 做 DevOps 还在被动救火?这篇让你把监控玩成 “运维加速器”!
  • 【CV】OpenCV基本操作④——算术操作
  • OpenGL视图变换矩阵详解:从理论推导到实战应用
  • 《四川棒球知识百科》球速最快的运动之一·棒球1号位
  • Grok-4 :AI 基准测试霸主,速度与智能并存——但代价几何?
  • 学习 Android (十九) 学习 OpenCV (四)
  • sql项目总结
  • 无人机报警器8G信号技术解析
  • npm install 报错问题解决 npm install --ignore-scripts
  • 嵌入式学习---(单片机)
  • 【Kubernetes知识点】监控升级,备份及Kustomize管理
  • Python 基础语法与控制流程学习笔记
  • 学习笔记:MYSQL(3)(常用函数和约束)
  • 嵌入式人别再瞎折腾了!这8个开源项目,解决按键/队列/物联网所有痛点,小白也能抄作业
  • 【JVS更新日志】低代码、物联网、无忧企业计划9.3更新说明!
  • GitLab Boards 深度解析:选型、竞品、成本与资源消耗
  • 上下文记忆力媲美Genie3,且问世更早:港大和可灵提出场景一致的交互式视频世界模型!
  • MindNode AI:AI辅助思维导图工具,高效整理思路快速搭框架
  • React学习教程,从入门到精通, React 组件语法知识点(9)
  • 【108】基于51单片机智能输液监测系统【Proteus仿真+Keil程序+报告+原理图】
  • 浅谈linux内存管理 的RMAP机制的作用和原理
  • 指针高级(1)
  • leetcode 38 外观数列
  • 线程通信机制
  • 【程序人生】有梦想就能了不起,就怕你没梦想
  • BurpSuite_Pro_V2024.6使用教程-Burp Suite代理设置详解
  • (Me)Adobe Media Encoder 2025音视频格式转码软件及视频编码软件,全新版免激活,安装即永久使用!