在使用Android Studio开发flutter项目的时候,使用print()
函数打印一些结果数据的时候,如果输出的内容很多就会出现内容被截断,打印出来的并不是全部的内容。就会导致我们开发过程中,无法及时查看一些重要的输出结果。
两个简单方便的解决方案:
1.使用debugPrint()
函数:
debugPrint()
是Flutter的foundation库中的调试打印函数,有如下的三个特点:
- 避免日志截断:在Android上,print() 的输出可能会被截断(超过一定长度后会被丢弃),而 debugPrint 会自动拆分长日志,确保完整输出,它封装了 print,将一次输出的内容长度限制在一个级别(内容过多时会分批输出),避免被Android内核丢弃。
- 调试模式专属:在 release 模式 下,debugPrint 不会输出任何内容,避免泄露敏感信息。
- 支持换行和格式化:可以正确处理多行文本,便于调试。
注意:在需要打印复杂数据(数组、对象等)时,使用 jsonEncode() 格式化输出。
用法:
import 'package:flutter/foundation.dart';
debugPrint('使用debugPrint打印数据:${jsonEncode(要打印的数据)}’);
如果上述方法打印出来的内容还是截断的,可以添加上参数wrapWidth ,wrapWidth参数仅决定每行的字符数,数字越小,表示每块打印出来的内容越少,分的块数越多。
举例说明:
final List ListData = [
{
"task_id": "1234567890",
"task_type": "paper_proofread",
"task_status": 1,
"task_create_time": "2023-05-01 12:00:00",
"task_update_time": "2023-05-01 12:00:00",
"task_content": "这是一段测试数据",
"task_result": "这是一段测试数据"
},
{
"task_id": "1234567890",
"task_type": "paper_proofread",
"task_status": 2,
"task_create_time": "2023-05-01 12:00:00",
"task_update_time": "2023-05-01 12:00:00",
"task_content": "这是一段测试数据",
"task_result": "这是一段测试数据"
},
{
"task_id": "1234567890",
"task_type": "paper_proofread",
"task_status": 3,
"task_create_time": "2023-05-01 12:00:00",
"task_update_time": "2023-05-01 12:00:00",
"task_content": "这是一段测试数据",
"task_result": "这是一段测试数据"
},
{
"task_id": "1234567890",
"task_type": "paper_proofread",
"task_status": 4,
"task_create_time": "2023-05-01 12:00:00",
"task_update_time": "2023-05-01 12:00:00",
"task_content": "这是一段测试数据",
"task_result": "这是一段测试数据"
},
{
"task_id": "1234567890",
"task_type": "paper_proofread",
"task_status": 5,
"task_create_time": "2023-05-01 12:00:00",
"task_update_time": "2023-05-01 12:00:00",
"task_content": "这是一段测试数据",
"task_result": "这是一段测试数据"
}
];
debugPrint('使用debugPrint打印数据:${jsonEncode(ListData)}', wrapWidth: 900);
wrapWidth: 900的输出结果:
wrapWidth: 600的输出结果:输出结果:
2.使用dart:developer包的log()函数:
import 'dart:developer' as dev;
dev.log(
jsonEncode(替换为要输出的数据),
name: ‘定义的’名称,
level: 800, // 自定义日志级别
);
注意:对于复杂对象(如:Map/List),dev.log 默认不会深度展开,需要手动转化为字符串才能打印出来:
dev.log(jsonEncode(要输出的数据), name: ‘输出的’数据); // 明确转为 JSON
为什么在控制台输出的内容会被截断?
这里使用三重门禁来比喻三大影响因素:
1. 第一道门:平台缓冲区(4KB 限制)——「安检闸机」
- 角色:Android/iOS 系统自带的物理安检门
- 规则:任何经过的包裹(日志)单件不能超过4KB(就像行李箱尺寸限制)
- 结果:print() 如果直接扔一个超大包裹(比如10KB文本),会被闸机当场拦腰斩断,只放行前半部分
2. 第二道门:Dart 的 print() 机制 ——「耿直快递员」
- 角色:一个不懂变通的快递员
- 行为:
- 收到你的大包裹后,不拆箱、不分批,直接往闸机里硬塞
- 明明可以分10次运送(分片输出),却偏要一次性暴力冲关
- 结果:闸机(平台限制)触发警报,包裹被截断
3. 第三道门:IDE/终端限制 ——「傲娇前台」
- 角色:公司前台的文件接收员
- 规则:
- 即使包裹通过了闸机(平台限制),如果单行日志太长,前台会说:「太占地方啦!」,偷偷扔掉后半部分
- 或者控制台显示区域有限,自动折叠超长内容(比如Android Studio默认设置)
- 结果:你看到的日志依然是残缺的
所以导致控制台输出的内容被截断的原因有三个分别是:平台缓存区(4KB限制)、Dart的print实现机制、IDE限制。这三大原因通常是叠加影响,共同作用的。