Flutter:获取Android Studio中print()语句的行号

时间:2018-07-08 18:04:38

标签: flutter

我在flutter上使用android studio(flutter plugin),是否还能获得print语句或debugPrint语句的行号?

当前它打印为:

flutter: sarmad@
flutter: sarm
flutter: null

它同时适用于 IOS android

4 个答案:

答案 0 :(得分:3)

我认为您需要此来进行调试。

您可以在打印语句中手动输入行号(输入类和/或方法的名称对我来说更好)。

您可以使用:

print(StackTrace.current);

或这个(几乎相同):

debugPrintStack();

打印堆栈跟踪,其中包括调用print和行号的类和方法,其余堆栈跟踪则使输出混乱。因此,您可以使用debugPrintStack(label: 'sarmad',maxFrames: 2);仅打印当前堆栈跟踪的前两行。

答案 1 :(得分:1)

获取我目前知道的行号的唯一方法是解析...\site-packages\pip\_internal\__init__.py", line 5, in <module> import logging ModuleNotFoundError: No module named 'logging' logging.py exists in \site-packages\pip\_internal\utils\ (and also contains an 'import logging' statement!)

有一个名为 stack_trace 的程序包,提供了各种解析方法。您可以通过更新pubspec.yaml文件将其安装在应用中:

StackTrace.current

然后您可以像这样获取当前帧的行号:

dependencies:
  stack_trace: ^1.9.2

不幸的是,这涉及很多解析以获得当前行号。

答案 2 :(得分:0)

我编写了一个简单的类,该类提供了StackTrace中的当前文件,行号和列行。

此处提供代码:

class CustomTrace {
  final StackTrace _trace;

  String fileName;
  int lineNumber;
  int columnNumber;

  CustomTrace(this._trace) {
    _parseTrace();
  }

  void _parseTrace() {
    /* The trace comes with multiple lines of strings, we just want the first line, which has the information we need */
    var traceString = this._trace.toString().split("\n")[0];

    /* Search through the string and find the index of the file name by looking for the '.dart' regex */
    var indexOfFileName = traceString.indexOf(RegExp(r'[A-Za-z]+.dart'));

    var fileInfo = traceString.substring(indexOfFileName);

    var listOfInfos = fileInfo.split(":");

    /* Splitting fileInfo by the character ":" separates the file name, the line number and the column counter nicely.
      Example: main.dart:5:12
      To get the file name, we split with ":" and get the first index
      To get the line number, we would have to get the second index
      To get the column number, we would have to get the third index
    */

    this.fileName = listOfInfos[0];
    this.lineNumber = int.parse(listOfInfos[1]);
    var columnStr = listOfInfos[2];
    columnStr = columnStr.replaceFirst(")", "");
    this.columnNumber = int.parse(columnStr);
  }
}

此类接收一个StackTrace对象,并读取其字符串并进行解析。

使用方法:

void main() {
  CustomTrace programInfo = CustomTrace(StackTrace.current);

  print("Source file: ${programInfo.fileName}, current line of code since the instanciation/creation of the custom trace object: ${programInfo.lineNumber}, even the column(yay!): ${programInfo.columnNumber}");
}

变量 programInfo 现在具有当前程序执行的行号,列号,甚至文件名。

您可以在控制台上打印以下内容:

print(StackTrace.current.toString());

您将看到字符串的外观,并能够理解我如何解析字符串以获取信息。

简单的好处是您不必安装任何库。我这样做是因为我只是使用Dart做一个项目,而我不想在我的简单项目中添加/安装任何第三方库。只需调用构造函数,您将得到一个具有所有信息的对象。

注意:该代码绝不是最优化的代码,但它可以:D。我希望看到一些更好的实现方式

答案 3 :(得分:0)

这是一个适用于 Dart VM 中运行的代码的实现:

/// Returns the current line number of the calling code.
///
/// Returns -1 on failure.
int get lineNumber {
  // Frame #1 is our caller.
  //
  // Example line to parse:
  // #1      someFunction (package:somePackage/someFile.dart:123:45)
  final re = RegExp(r'^#1[ \t]+.+:(?<line>[0-9]+):[0-9]+\)$', multiLine: true);
  final match = re.firstMatch(StackTrace.current.toString());
  return (match == null) ? -1 : int.parse(match.namedGroup('line'));
}

用法:

print('Reached line $lineNumber');

请注意,这不适用于堆栈跟踪可以具有不同格式的网络。

这个解析代码是可复制和粘贴的,应该足以进行快速和临时的打印式调试。对于生产代码,我建议改用 package:stack_trace 进行解析。