精华内容
下载资源
问答
  • flutter 提供了 print(Object object) 来向开发工具的控制 台输出日志信息 print("test"); common_utils 工具类已经将pring 封装为工具类 common_utils: ^1.1.1 使用common_utils工具类中的LogUtil //初始化设置 ...

    重要消息


    目前在西瓜视频上免费刊登 Flutter 系列教程,每日更新,欢迎关注接收提醒

    【x1】点击查看提示

    【x2】各种系列的教程

    【x3】flutter 点滴积累 系列文章


    flutter 提供了 print(Object object) 来向开发工具的控制 台输出日志信息

    print("test");
    

    可以通过插值法直接输出基本数据类型如下 :

    String str ="张三"print("测试输出 $str ");
    
    int count = 40;
    print("测试输出 $count ");
    

    如果是对象类型的,比如要输出对象的一个属性的值,可以这样做:

     User user = new User(name:"张三");
     
     ///输出name
     print("测试输出 ${user.name} ");
    

    common_utils 工具类已经将pring 封装为工具类

    common_utils: ^1.1.1
    

    使用common_utils工具类中的LogUtil

    //初始化设置 LogUtil
    LogUtil.init(true);
    //输出日志
    LogUtil.v("test");
    

    当然 LogUtil 的 init 方法可根据是否是生产环境来配置 true 与 false ,如果是 false ,则不输出日志,这样的一个优化也是应用在发版本后可以节省向控制台输出日志信息的消耗。

    封装源码如下

    class LogUtil {
      static const String _TAG_DEF = "###common_utils###";
    
      static bool debuggable = false; //是否是debug模式,true: log v 不输出.
      static String TAG = _TAG_DEF;
    
      static void init({bool isDebug = false, String tag = _TAG_DEF}) {
        debuggable = isDebug;
        TAG = tag;
      }
    
      static void e(Object object, {String tag}) {
        _printLog(tag, '  e  ', object);
      }
    
      static void v(Object object, {String tag}) {
        if (debuggable) {
          _printLog(tag, '  v  ', object);
        }
      }
    
      static void _printLog(String tag, String stag, Object object) {
        StringBuffer sb = new StringBuffer();
        sb.write((tag == null || tag.isEmpty) ? TAG : tag);
        sb.write(stag);
        sb.write(object);
        print(sb.toString());
      }
    }
    
    

    完毕 每日积累 尽在点滴

    展开全文
  • 一、思考做iOS开发时这个功能很常用, 在OC和Swift中都可以很轻松实现,因为系统本来就提供了用于日志输出的预处理宏,只要我们拿来拼接就可以了,但是在Dart中并不提供这些,那有什么办法实现它呢?我们回想在开发...

    一、思考

    做 iOS 开发时这个功能很常用, 在 OC 和 Swift 中都可以很轻松实现,因为系统本来就提供了用于日志输出的预处理宏,只要我们拿来拼接就可以了,但是在 Dart 中并不提供这些,那有什么办法实现它呢?

    我们回想在开发过程中,是不是发现只要一不小心抛异常,就可以看到类似如下的打印内容,而且还能清楚的知道异常是在哪个文件和哪一行的代码造成的。

    610b945ccecd5364e2486bbca6c009b3.png

    所以如果我们可以在调用函数时拿到当前调用堆栈,就可以取到一系列想要的数据。

    二、实践

    在 dart:core 中提供了 堆栈跟踪(StackTrace),可以通过 StackTrace.current 取到当前的堆栈信息,打印如下图所示,会发现这不好拿到我们想要的信息。

    6c7a091911dbdccb47a92e83ff3cb4e6.png

    这里我用到了官方开发的一个包 stack_trace,它可以将堆栈信息变得更多人性化,并方便我们查看堆栈信息和获取想要的数据。

    ps: stack_trace 在 Flutter 环境下直接导包即可使用,而在纯 Dart 下需要将其添加为依赖于pubspec.yaml中。

    12
    dependencies:  stack_trace: ^1.9.3

    那下面我们来试试 stack_trace 的威力吧

    12345678910111213
    import 'package:stack_trace/stack_trace.dart';// 将 StackTrace 对象转换成 Chain 对象// 当然,这里也可以直接用 Chain.current();final chain = Chain.forTrace(StackTrace.current);// 拿出其中一条信息final frames = chain.toTrace().frames;final frame = frames[1];// 打印print("所在文件:${frame.uri} 所在行 ${frame.line} 所在列 ${frame.column}");// 打印结果// flutter: 所在文件:package:flutterlog/main.dart 所在行 55 所在列 23

    三、呈上代码

    下面我做了一点封装,直接拿走即可使用,打印效果如下所示:

    完整的代码和示例请到GitHub上【查看】。

    b52d88b3ec8f64d765eb3a025e374ecf.png

    代码:

    1234567891011121314151617181920212223242526272829303132333435363738394041424344
    // log.dartenum FLogMode {  debug,    // ? DEBUG  warning,  // ? WARNING  info,     // ? INFO  error,    // ❤️ ERROR}void FLog(dynamic msg, { FLogMode mode = FLogMode.debug }) {  if (kReleaseMode) { // release模式不打印    return;  }  var chain = Chain.current(); // Chain.forTrace(StackTrace.current);  // 将 core 和 flutter 包的堆栈合起来(即相关数据只剩其中一条)  chain = chain.foldFrames((frame) => frame.isCore || frame.package == "flutter");  // 取出所有信息帧  final frames = chain.toTrace().frames;  // 找到当前函数的信息帧  final idx = frames.indexWhere((element) => element.member == "FLog");  if (idx == -1 || idx+1 >= frames.length) {    return;  }  // 调用当前函数的函数信息帧  final frame = frames[idx+1];  var modeStr = "";  switch(mode) {    case FLogMode.debug:      modeStr = "? DEBUG";      break;    case FLogMode.warning:      modeStr = "? WARNING";      break;    case FLogMode.info:      modeStr = "? INFO";      break;    case FLogMode.error:      modeStr = "❤️ ERROR";      break;  }  print("$modeStr ${frame.uri.toString().split("/").last}(${frame.line}) - $msg ");}
    展开全文
  • Flutter Dart print 日志打印

    万次阅读 2019-10-14 15:03:28
    print('我是日志'); String name = '野猿新一'; print('我的名字叫${name}'); 没啦,就这么简单
    print('我是日志');
    String name = '野猿新一';
    print('我的名字叫${name}');

    没啦,就这么简单

    展开全文
  • Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的 print() 或者 debugPrint() 方法进行打印,但是这两种打印,日志都是默认 Info 层级的日志,很不友好,所以如果需要日志打印层级分明,...
  • Flutter实战之自定义日志打印组件

    千次阅读 2019-03-16 13:14:16
    Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的print()或者debugPrint()方法进行打印,但是这两种打印,日志都是默认Info层级的日志,很不友好,所以如果需要日志打印层级分明,我们就...

    前言

    在Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的print()或者debugPrint()方法进行打印,但是这两种打印,日志都是默认Info层级的日志,很不友好,所以如果需要日志打印层级分明,我们就需要自定义一个日志打印组件,以下就来介绍如何自定义日志打印组件。

    如何让输出的日志层级分明?

    换种方式想,如果我们能在Flutter代码中,能够调用到原始Android中的Log组件,岂不是就能解决日志打印问题?

    如何进行关联

    在Flutter中,可以使用MethodChannel进行关联,让Flutter调用特定平台(如Android、IOS)的相关API,对于MethodChannel的使用说明和相关介绍,可参考官方文档: 点击查看

    这里简单说明下, Flutter关于特定平台的API,主要是依赖其灵活的消息传递方式来执行的,而并非一套完整的代码生成的。啥意思呢?

    • Flutter可以通过平台通道向其宿主(Android、IOS)发送消息;
    • 其宿主监听平台通道,接收发送过来的消息;
    • 宿主平台通过接收到的消息执行宿主特有的API,然后将响应结果返回给客户端(也就是Flutter部分)更新状态。

    下面用代码简单说明:

    • Step1:创建Flutter平台客户端
    import 'package:flutter/services.dart';
    
    ///一个日志打印工具类
    class LogUtils {
      LogUtils._();
    
      //第一步:设置平台,并进行命名
      static const _platform = const MethodChannel('com.yancy.flutter.plugins/log');
    
      //第二步,设置相关需要传递的方法
      //invokeMethod方法接收的参数,第一个必选参数,设置的是方法的名称;后面的参数为可选的需要传递的参数
      static void i(String tag, String msg) {
        _platform.invokeMethod('logI', {'tag': tag, 'msg': msg});
      }
    
      static void d(String tag, String msg) {
        _platform.invokeMethod('logD', {'tag': tag, 'msg': msg});
      }
    
      static void v(String tag, String msg) {
        _platform.invokeMethod('logV', {'tag': tag, 'msg': msg});
      }
    
      static void w(String tag, String msg) {
        _platform.invokeMethod('logW', {'tag': tag, 'msg': msg});
      }
    
      static void e(String tag, String msg) {
        _platform.invokeMethod('logE', {'tag': tag, 'msg': msg});
      }
    
    }
    复制代码
    • Step2:宿主端建立对应通道接收端
    package com.yancy.flutter.host;
    
    import android.content.Context;
    import android.util.Log;
    import android.widget.Toast;
    
    import io.flutter.plugin.common.BinaryMessenger;
    import io.flutter.plugin.common.MethodChannel;
    
    /**
     * 说明:
     *
     * @author Yancy
     * @date 2019/3/15
     */
    public class CustomFlutterPlugins {
      
        //这里必选要跟Flutter平台名称对应上,否则无法接收消息
        private static final String LOG_CHANNEL_NAME = "com.yancy.flutter.plugins/log";
    
        public static void registerLogger(BinaryMessenger messenger) {
            new MethodChannel(messenger, LOG_CHANNEL_NAME).setMethodCallHandler((methodCall, result) -> {
                String tag = methodCall.argument("tag");
                String msg = methodCall.argument("msg");
                switch (methodCall.method) {
                    case "logV":
                        Log.v(tag, msg);
                        break;
                    case "logD":
                        Log.d(tag, msg);
                        break;
                    case "logI":
                        Log.i(tag, msg);
                        break;
                    case "logW":
                        Log.w(tag, msg);
                        break;
                    case "logE":
                        Log.e(tag, msg);
                        break;
                    default:
                        Log.d(tag, msg);
                        break;
                }
            });
        }
    }
    复制代码

    上面的switch里面的部分即对于flutter中invokeMethod方法中的第一个参数名称。

    • Step3:然后我们在宿主的MainActivity中进行调用注册即可完成通道的建立。
    public class MainActivity extends FlutterActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);
    
        CustomFlutterPlugins.registerLogger(getFlutterView());
      }
    }
    复制代码
    • Step4:Flutter中调用LogUtils相关方法,打印日志。
    class MyApp extends StatelessWidget {
    
      @override
      Widget build(BuildContext context) {
        print('print------');
        debugPrint('debugPrint-----');
        LogUtils.v('yancy', 'v-------');
        LogUtils.d('yancy', 'd-------');
        LogUtils.i('yancy', 'i-------');
        LogUtils.w('yancy', 'w-------');
        LogUtils.e('yancy', 'e-------');
    
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
    
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    复制代码

    控制台输出的打印结果如下:

    至此,一个简单的日志打印组建就开发完成啦。

    结语

    目前Flutter很多组建需要原始平台API支持,我们完全可以利用好MethodChannel进行相关功能开发,例如Flutter中对于toast提示,目前自带的是SnackBar组件,如果想要使用Android自带的Toast,完全可以使用本文中类似的方法进行封装。

    Tips

    关于Flutter日志打印,评论区说到devtools关于日志的打印,大家也可以看看这里的说明devtools/logging

    转载于:https://juejin.im/post/5c8cf49e51882575eb6ad6ac

    展开全文
  • 一、思考做 iOS 开发时这个功能很常用, 在 OC 和 Swift 中都可以很轻松实现,因为系统本来就提供了用于日志输出的预处理宏,只要我们拿来拼接就可以了,但是在 Dart 中并不提供这些,那有什么办法实现它呢?...
  • 在iOS调试Flutter时,默认的日志打印在Xcode的控制台上,而不是在Android Studio的控制台上。 只要在Android Studio的控制台上执行命令:flutter logs就可以Android Studio的控制台上输出日志了。 这样报错时,...
  • flutter日志工具

    2020-03-18 18:32:27
    以前用惯了as的logcat,现在在接触flutter,但是打印日志窗口真的让我蒙了,啥功能都没有,于是自己写了一个小工具,至少分下类过滤一下 class LogUtils { static const bool debug = true; //显示debug,info,...
  • 如题,一句话,就是想用Android Studio统一打印ios日志和Android日志; 直接上方法,执行如下命令: flutter logs As you know,一般情况下Android Studio只能在Logcat中打印Android手机的app信息,如果app...
  • 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面介绍一个强大的软件包:logger。 Logger 是一款易于使用且可扩展的日志记录器,可打印精美的日志。 受到Android记录...
  • ios手机升级到13后,flutter调试模式下print会无效,不打印调试日志 解决方法有几种: 等官方更新,或者切到flutter的master分支,方法是执行flutter channel master。这个方法我没试过,也不推荐,业务master分支...
  • 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面介绍一个强大的软件包:logger。 Logger 是一款易于使用且可扩展的日志记录器,可打印精美的日志。 受到Android记录...
  • 强大的日志软件包在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面介绍一个强大的软件包:logger。Logger 是一款易于使用且可扩展的日志记录器,可打印精美的日志。 ...
  • 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面介绍一个强大的软件包:logger。 Logger 是一款易于使用且可扩展的日志记录器,可打印精美的日志。 受到Android记录...
  • 封装网络请求的几个好处:便于统一配置请求参数,如header,公共参数,加密规则等方便调试,详细的日志打印信息优化代码性能,避免到处滥new对象,构建全局单例简化请求步骤,只暴露需要的响应数据,而对错误的响应...
  • 平常在开发安卓或者java 以及flutter 的时候都有用到对应端的日志打印来调试代码。今天就分享一下鸿蒙里面日志打印使用技巧。 准备工作: 1 安装鸿蒙开发环境 大家可以看我之前的文章 华为鸿蒙系统开发初体验 :...
  • Flutter常用命令简介

    2020-05-18 23:23:50
    查看帮助信息 类似命令的使用指南 -h/--help可以作为别的命令的后缀使用 打印详细的命令使用指南 如 flutter run -h 2. flutter create 创建项目 跟上项目的名称 即可创建Flutter项目 3. flutter run 运行项目 ...
  • 方便调试,详细的日志打印信息 优化代码性能,避免到处滥new对象,构建全局单例 简化请求步骤,只暴露需要的响应数据,而对错误的响应统一回调 对接口数据的基类封装,简化解析流程 无侵入的,灵活的请求loading配置...
  • 前言:在Flutter应用中,导航栏切换页面后默认情况下会丢失原页面状态,即每次进入页面时都会重新初始化状态,如果在initState中打印日志,会发现每次进入时都会输出,显然这样增加了额外的开销,并且带来了不好的...
  • flutter,打开Logcat视窗

    2020-07-09 20:23:26
    后来发现flutter项目自动打印出来的日志都是没有时间的,神经病一样。后来就想啊,是不是可以调出Logcat呢,还真嫩。 解决方法: 点击 或者找到Project Structure菜单,进入,找到Facets,点击+,, 选择Android...
  • Flutter Dio的简易封装和demo

    千次阅读 2019-06-16 17:07:11
    一个简单的flutter dio的封装, 包括: 日志打印, 网络进度, 返回json转bean, get post upload方法的封装, 简易可直接运行的demo Getting Started Clone & Run main.dart 网络相关代码在net目录, 直接复制即可使用...
  • 地址:https://pub.flutter-io.cn/packages/common_utils#-readme-tab- Dart常用工具类库 common_utils 1、TimelineUtil : 时间轴.(新) 2、TimerUtil : 倒计时,定时任务.(新) ...4、LogUtil : 简单封装打印日志.(...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

flutter打印日志