flutter 中間組件自適應寬度

使用Flexible + IntrinsicWidth

Row(children: [Text('第一個text'),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.pswp.cn/web/95654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95654.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TDengine 時間函數 DAYOFWEEK 用戶手冊

DAYOFWEEK 函數使用手冊 函數描述 DAYOFWEEK 函數用于返回指定日期是一周中的第幾天。該函數遵循標準的星期編號約定&#xff0c;返回值范圍為 1-7&#xff0c;其中&#xff1a; 1 星期日 (Sunday)2 星期一 (Monday)3 星期二 (Tuesday)4 星期三 (Wednesday)5 星期四 (T…

【STM32】貪吃蛇 [階段 3] 增強模塊結構(架構優化)

這篇博客是 承接&#xff1a;【項目思維】貪吃蛇&#xff08;嵌入式進階方向&#xff09;中 聚焦于 &#x1f9f1; 階段 3&#xff1a;增強模塊結構&#xff08;架構優化&#xff09; 中的 菜單系統&#xff08;Menu System&#xff09;&#xff0c;這部分的結構優化可以學到的…

江協科技STM32學習筆記補充之004

STM32 ISP 一鍵下載電路&#xff08;按功能、邏輯與時序拆解&#xff09;

數據庫小冊(1)

1. 關系型數據庫主要考點關系型數據庫&#xff1a;架構索引鎖語法理論規范2. 如何設計一個關系型數據庫設計即模塊劃分。數據庫最主要的功能是存儲我們的數據&#xff0c;所以需要一個存儲的文件系統。我們要把涉及到的物流數據提供邏輯的形式給組織和表示出來&#xff0c;這是…

記錄收入最高的一次私活 選號網,需要大量賣號的人可能需要,比如游戲腳本批量跑的號

選號網管理后臺(上傳游戲信息、賬號信息、 查看記錄) http://124.223.214.5:180/admin1 選號網客戶端(PC/H5頁面 給客戶篩選商品用) http://124.223.214.5:181/ 該在線地址僅供低頻率測試&#xff0c;正式使用需要另外部署。 功能不滿足可以聯系開發者定制 一、項目的由來 …

熱烈慶祝“中國抗戰勝利80周年”,織信低代碼助力國之重器砥礪前行!

“從保家衛國到科技強軍&#xff0c;織信低代碼平臺為軍工企業數字化轉型注入新動能。”80年后的今天&#xff0c;國人記憶從未褪色。2025年9月3日&#xff0c;正值中國抗戰勝利80周年閱兵之際&#xff0c;我國國防軍工力量在經歷長期的艱苦奮斗后&#xff0c;現今終于迎來了曙…

PostgreSQL與SQL Server:B樹索引差異及去重的優勢

PostgreSQL與SQL Server&#xff1a;B樹索引差異及去重的優勢 在優化查詢性能方面&#xff0c;索引是數據庫工程師可使用的最強大工具之一。PostgreSQL和Microsoft SQL Server&#xff08;或Azure SQL&#xff09;都將B樹索引用作其默認索引結構&#xff0c;但每個系統實現、維…

【微實驗】使用MATLAB制作一張賽博古琴?

當一個理工音樂人沒錢去買古琴&#xff0c;我直接用代碼畫一個古琴&#xff01;目錄 零、總腳本&#xff1a; 一、核心功能&#xff1a;交互模塊拆解 二、核心價值 一、初始化腳本&#xff1a;參數配置與啟動界面 ①廢話不說&#xff0c;直接上代碼 ②代碼模塊拆解與詳細解…

畢業項目推薦:67-基于yolov8/yolov5/yolo11的大棚黃瓜檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全&#xff08;可點擊查看&#xff0c;不定時更新中&#xff09;概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式…

無人機小尺寸RFSOC ZU47DR板卡

整板尺寸&#xff1a;120*120mmFPGA: XCZU47DR-2FFVE1156I;DDR&#xff1a;PS側8GB 2400Mhz*64bit / PL側 4GB 2400Mhz*32bit&#xff1b;2路(QSP0QSPI1)/單片512Mb、共計1Gb&#xff1b;千兆以太網&#xff1a;1路&#xff08;PS側&#xff09;&#xff1b;主要接口資源如下&a…

LangGraph(一):入門從0到1(零基礎)

文章目錄LangGraph入門從0到10?? 安裝 & 確認環境1?? 把 LangGraph 想象成「自動化的做菜流水線」2?? 最小可運行例子&#xff1a;一句話復讀機3?? 加一個小節點&#xff1a;把用戶輸入變大寫4?? 條件邊&#xff1a;如果用戶說 quit 就結束&#xff0c;否則復讀5…

學習數據結構(16)快速排序

快速排序的基本思想&#xff1a;快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c;其基本思想為&#xff1a;任取待排序元素序列中的某元素作為基準值&#xff0c;按照該基準值將待排序集合分割成兩子序列&#xff0c;左子序列中所有元素均小于基準值&am…

uni-app iOS 上架常見問題與解決方案,實戰經驗全解析

uni-app 讓開發者能夠“一套代碼&#xff0c;多端運行”&#xff0c;極大降低了開發成本。 但當應用進入 iOS 上架階段 時&#xff0c;不少團隊發現流程并沒有想象中那么順利&#xff1a;證書問題、打包失敗、上傳出錯、審核被拒……這些都可能讓項目卡殼。 本文結合實際案例&a…

洗衣機的智能升級集成方案WT2606B屏幕驅動+AI語音控制

2025&#xff0c;洗衣機市場正從功能滿足轉向體驗升級&#xff0c;企業正面臨哪些轉型難點?一文為您解讀洗衣機行業智能化升級之路。傳統洗衣機就像是一個"沉默的工人"&#xff0c;只能通過簡單的LED指示燈告訴你它在工作&#xff0c;卻無法讓你真正了解它在干嘛。用…

機器學習進階,梯度提升機(GBM)與XGBoost

梯度提升機&#xff08;Gradient Boosting Machine, GBM&#xff09;&#xff0c;特別是其現代高效實現——XGBoost。這是繼隨機森林后自然進階的方向&#xff0c;也是當前結構化數據競賽和工業界應用中最強大、最受歡迎的算法之一。為什么推薦XGBoost&#xff1f; 與隨機森林互…

【ARMv7】開篇:掌握ARMv7架構Soc開發技能

本專欄&#xff0c;開始與大家共同總結使用ARMv7系列CPU的Soc開發技能。大概匯總了一下&#xff0c;后面再逐步完善下面的思維導圖。簡單說說&#xff1a;與通用的ARMv7-A/R相比&#xff0c;以STM32F為代表的ARMv7-M架構有以下關鍵區別和重點&#xff1a;無MMU&#xff0c;有MP…

【學術會議論文投稿】JavaScript在數據可視化領域的探索與實踐

【ACM出版 | EI快檢索 | 高錄用】2024年智能醫療與可穿戴智能設備國際學術會議&#xff08;SHWID 2024&#xff09;_艾思科藍_學術一站式服務平臺 更多學術會議請看 學術會議-學術交流征稿-學術會議在線-艾思科藍 目錄 引言 JavaScript可視化庫概覽 D3.js基礎入門 1. 引入…

CSS基礎學習步驟

好的&#xff0c;這是一份為零基礎初學者量身定制的 **CSS 學習基礎詳細步驟**。我們將從最根本的概念開始&#xff0c;通過一步一步的實踐&#xff0c;帶你穩穩地入門。 第一步&#xff1a;建立核心認知 - CSS 是做什么的&#xff1f; 1. 理解角色&#xff1a; HTML&…

MTK Linux DRM分析(三十七)- MTK phy-mtk-hdmi.c 和 phy-mtk-hdmi-mt8173.c

一、簡介 HDMI PHY驅動 HDMI 的物理層接口主要就是 HDMI Type-A 接口(19 pin),除此之外還有 Type-B、Type-C(Mini HDMI)、Type-D(Micro HDMI)、Type-E(車載專用)。 1. HDMI Type-A(常見 19-pin 標準接口) HDMI Type-A Connector Pinout ========================…

【人工智能學習之MMdeploy部署踩坑總結】

【人工智能學習之MMdeploy部署踩坑總結】報錯1&#xff1a;TRTNet: device must be a GPU!報錯2&#xff1a;Failed to create Net backend: tensorrt報錯3&#xff1a;Failed to load library libonnxruntime_providers_shared.so1. 確認庫文件是否存在2. 重新安裝 ONNX Runti…