如何在Text widget中每隔n个字符对字符串进行换行截断处理
实现方法
方法1:固定字符长度拆分(提前指定每行字符数)
先定义字符串拆分工具函数,按指定长度切割字符串后用换行符拼接,放入Text组件即可。
代码示例:
// 字符串拆分工具函数 String splitStringByLength(String input, int splitLength) { List<String> chunks = []; for (int i = 0; i < input.length; i += splitLength) { int end = i + splitLength < input.length ? i + splitLength : input.length; chunks.add(input.substring(i, end)); } return chunks.join('\n'); } // 布局中使用 Row( children: [ // 必须用Expanded/Flexible包裹Text,避免Row布局溢出 Expanded( child: Text( splitStringByLength('0xaff0a761260a3c6a271738550f0d7669dc6de96b5629ed7398735c61b8c55555', 20), // 搭配等宽字体保证每行字符数对齐 style: TextStyle(fontFamily: 'monospace'), ), ), ], )
方法2:自适应布局宽度拆分(根据Row可用宽度动态调整每行字符数)
如果需要根据布局可用空间自动决定拆分长度,可以搭配LayoutBuilder获取可用宽度后动态计算拆分长度:
Row( children: [ Expanded( child: LayoutBuilder( builder: (context, constraints) { const textStyle = TextStyle(fontFamily: 'monospace', fontSize: 14); // 等宽字体下单个字符宽度约为字号的0.6倍,可根据实际字体调整 final charWidth = textStyle.fontSize! * 0.6; final maxCharPerLine = (constraints.maxWidth / charWidth).floor(); final processedStr = splitStringByLength('0xaff0a761260a3c6a271738550f0d7669dc6de96b5629ed7398735c61b8c55555', maxCharPerLine); return Text(processedStr, style: textStyle); }, ), ), ], )
注意事项
- Row组件的子元素默认无宽度约束,必须用
Expanded或Flexible包裹Text组件,否则文本不会触发换行,会出现布局溢出提示。 - 建议搭配等宽字体使用,避免不同字符宽度不同导致的每行字符数不一致、对齐错位的问题。
内容的提问来源于stack exchange,提问作者flutterisbae
相关产品推荐
相关产品推荐

