使用案例
"参数:${settings.arguments}".log(); // 普通文本输出
null.log(); // 对象输出
打印输出内容
普通文本输出结果
flutter:
=========================开始===========================
文件: main.dart -> 55行
内容: 参数:null
=========================结束===========================
对象输出结果
flutter:
=========================开始===========================
文件: main.dart -> 56行
内容: null
=========================结束===========================
源码
extension StringExtension on String {
/// 打印
void log() {
CustomTrace info = CustomTrace(StackTrace.current);
if (info != null &&
info.fileName != null &&
info.lineNumber != null) {
print(
"\n=========================开始===========================\n文件: ${info.fileName} -> ${info.lineNumber}行 \n内容: $this\n=========================结束===========================");
} else {
print("\n=========================开始===========================\n内容: $this\n=========================结束===========================");
}
}
}
extension ObjectExtension on Object {
void lod() {
String string = this.toString();
string.log();
}
}
class CustomTrace {
final StackTrace _trace;
String fileName;
int lineNumber;
int columnNumber;
CustomTrace(this._trace) {
_parseTrace();
}
void _parseTrace() {
var list = this._trace.toString().split("\n");
var traceString = list.first;
if (list.length > 1) traceString = list[1];
var indexOfFileName = traceString.indexOf(RegExp(r'[A-Za-z_]+.dart'));
var fileInfo = traceString.substring(indexOfFileName);
var listOfInfos = fileInfo.split(":");
this.fileName = listOfInfos[0];
this.lineNumber = int.parse(listOfInfos[1]);
var columnStr = listOfInfos[2];
columnStr = columnStr.replaceFirst(")", "");
this.columnNumber = int.parse(columnStr);
}
}
踩坑(因为刚学Flutter 代码啥的都是百度的)
因为是扩展越简单越方便 怎么简单怎么来 那么我们想获取的信息可能会存在异常 如下:
从使用上来说 每次都需要携带StackTrace.current
堆栈信息是比较麻烦的所以我将其写在了方法内部 但是问题来了 这样获取的最前面一个信息是当前的扩展信息
CustomTrace info = CustomTrace(StackTrace.current);
百度方法打印
void _parseTrace() {
var list = this._trace.toString().split("\n");
var traceString = list.first;
var indexOfFileName = traceString.indexOf(RegExp(r'[A-Za-z_]+.dart'));
var fileInfo = traceString.substring(indexOfFileName);
var listOfInfos = fileInfo.split(":");
this.fileName = listOfInfos[0];
this.lineNumber = int.parse(listOfInfos[1]);
var columnStr = listOfInfos[2];
columnStr = columnStr.replaceFirst(")", "");
this.columnNumber = int.parse(columnStr);
}
输出一直异常 一直定位到扩展
flutter:
=========================开始===========================
文件: extension.dart -> 9行
内容: 参数:{}
=========================结束===========================
我们来打印信息看看
void _parseTrace() {
print(this._trace.toString()); // 打印信息
...
}
输出结果(从以下结果可以看出最前面一个一直会是我们的扩展, 而真实想要的信息是第二个)
flutter:
#0 StringExtension.log (package:flutter_demo/extension/extension.dart:9:47)
#1 _MyAppState.routeFactory (package:flutter_demo/main.dart:55:32)
#2 routeFactoryWrapper.<anonymous closure> (package:flutter_boost/src/boost_navigator.dart:17:29)
#3 BoostPage.create (package:flutter_boost/src/flutter_boost_app.dart:638:55)
#4 new BoostContainer (package:flutter_boost/src/boost_container.dart:14:26)
#5 FlutterBoostAppState._createContainer (package:flutter_boost/src/flutter_boost_app.dart:178:12)
#6 FlutterBoostAppState.initState (package:flutter_boost/src/flutter_boost_app.dart:91:9)
#7 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4723:57)
#8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4556:5)
#9 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3631:14)
#10 Element.updateChild (package:flutter/src/widgets/framework.dart:3383:18)
#11 ComponentElement.performRebuil<…>
改进写法(把自己这一层排除掉OK)
void _parseTrace() {
var list = this._trace.toString().split("\n");
var traceString = list.first;
if (list.length > 1) traceString = list[1]; // 有多个时去掉扩展这一层
var indexOfFileName = traceString.indexOf(RegExp(r'[A-Za-z_]+.dart'));
var fileInfo = traceString.substring(indexOfFileName);
print("打印" + this._trace.toString());
var listOfInfos = fileInfo.split(":");
this.fileName = listOfInfos[0];
this.lineNumber = int.parse(listOfInfos[1]);
var columnStr = listOfInfos[2];
columnStr = columnStr.replaceFirst(")", "");
this.columnNumber = int.parse(columnStr);
}
网友评论