print("Source file: ${programInfo.fileName}, function: ${programInfo.functionName}, caller function: ${programInfo.callerFunctionName}, current line of code since the instanciation/creation of the custom trace object: ${programInfo.lineNumber}, even the column(yay!): ${programInfo.columnNumber}");
6条答案
按热度按时间atmip9wb1#
我写了一个简单的类,它给出了当前函数和调用函数,以及StackTrace.current属性中的文件名、行号和列行。
验证码:
字符串
这个类接受一个StackTrace对象,读取它的字符串并解析它。
如何使用它(获取信息):
型
变量 programInfo 现在有函数名、调用者函数名、行号、列号,甚至是当前程序执行的文件名。
您可以将以下内容打印到控制台:
型
你会看到字符串的样子,并能够理解我如何解析字符串,以获得信息。
这样做的好处是你不需要安装任何库。我这样做是因为我正在做一个只使用Dart的项目,我不想在我的简单项目中添加/安装任何第三方库。你最终会得到一个对象,只需调用构造函数就可以获得所有信息。这样做的缺点是,如果Dart出于某种原因,改变堆栈跟踪的字符串格式,这将不再起作用,但如果这种情况发生,你可以很容易地改变这个类解析帧的方式 */
注意:这段代码绝不是最优化的代码,但它工作正常:D.我希望看到一些更好的实现和抽象。
7vux5j2d2#
无法直接访问Dart反射库中的调用堆栈。
你可以得到堆栈跟踪的字符串表示,然后尝试解析它:
字符串
stack_trace包尝试为您对许多已知的堆栈跟踪格式执行此操作,因此可能:
型
siv3szwd3#
整理了一下@LuisDev99的答案,为自己优化:
olhwl3o24#
字符串
另见https://github.com/dart-lang/sdk/issues/11916#issuecomment-108381556
这只在Dart命令行VM中有效,但在浏览器或Flutter中无效,因为不支持反射。
像https://pub.dartlang.org/packages/reflectable这样的代码生成解决方案可能在反射不可用的地方起作用。
https://github.com/dart-lang/sdk/issues/28372似乎相关。
yqkkidmi5#
LuisDev99的答案不能很好地科普内部方法和匿名lambda块,所以我使用了更复杂的正则表达式方法。
我的解决方案:
字符串
vnjpjtjt6#
在我的例子中,我只需要Flutter中调用者的类和函数名。
字符串
打印
SampleClass.someMethod ::: RED