美文网首页
Flutter-打印获取文件行号扩展

Flutter-打印获取文件行号扩展

作者: SK丿希望 | 来源:发表于2021-11-09 10:22 被阅读0次

使用案例

"参数:${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);
  }

参考https://www.jianshu.com/p/54f0efc2b606

相关文章

  • Flutter-打印获取文件行号扩展

    使用案例 打印输出内容 源码 踩坑(因为刚学Flutter 代码啥的都是百度的) 因为是扩展越简单越方便 怎么简单...

  • Swift之#function、#fine、#line

    file:打印当前文件路径 line:打印当前行号,整数 function:打印当前函数或方法 column :所...

  • Linux常用命令

    文件相关 1. cat 打印整个文件内容 cat file cat -n file 打印出的内容显示行号 2....

  • Swift 如何获取当前代码的函数名和行号

    #file 用于获取当前文件文件名#line 用于获取当前行号#column 用于获取当前列编号#function...

  • Python 打印所在文件和行号

    日志打印函数,输出日志信息和被调用时所在的文件和行号

  • 十九、PHP魔术常量

    1、 __LINE__ 获取文件中的当前行号 2、 __FILE__ 获取文件的完整路径和文件名,如果用在...

  • NSLog

    __func__打印的是当前方法用在那个函数里面__LINE__打印当前代码在文件中的行号__FILE__打印当前...

  • 2021-01-20 swift关键字

    1、带#的关键字 代码作用#file获取所在文件#function获取所在的方法#line获取所在的行号#colu...

  • iOS - Swift自定义print函数

    【Swift】自定义print函数打印出文件名、方法名、行号 输出的效果 输出效果

  • nl命令的使用

    nl命令常用参数:nl命令用来查看一个文本文件,并自动加上行号,默认空行不加行号。-b a 不论是否是空行,都打印...

网友评论

      本文标题:Flutter-打印获取文件行号扩展

      本文链接:https://www.haomeiwen.com/subject/krjmzltx.html