Dart带参数单例实现:全局应用Logger日志实例的正确配置方式
实现方案
方案1:顶层全局变量(推荐最简单场景)
Dart 中的顶层变量默认是懒加载的,只会在首次被引用时完成初始化,完全满足你仅实例化一次 Logger 和 PrettyPrinter 的需求,实现成本最低:
- 新建单独的工具文件例如
lib/utils/logger.dart,写入如下代码:
import 'package:logger/logger.dart'; final logger = Logger( printer: PrettyPrinter( methodCount: 2, colors: true, ), );
- 其他业务文件只要导入这个
logger.dart就可以直接全局共用同一个 logger 实例:
import 'package:你的项目名/utils/logger.dart'; // 使用示例 logger.d("调试日志"); logger.e("错误日志", error: e, stackTrace: stackTrace);
方案2:单例类封装(适合需要扩展日志能力的场景)
如果你后续需要给日志增加额外逻辑(比如日志上报、不同环境动态调整日志级别、自定义过滤规则),可以封装为单例类:
import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; class AppLogger { // 单例实例 static final AppLogger _instance = AppLogger._internal(); // 内部Logger实例 final Logger _logger; // 工厂构造返回单例 factory AppLogger() => _instance; // 私有构造,禁止外部实例化 AppLogger._internal() : _logger = Logger( printer: PrettyPrinter( methodCount: 2, colors: true, ), // 可选配置:release环境关闭日志输出 level: kReleaseMode ? Level.off : Level.debug, ); // 封装常用日志方法 void debug(String message) => _logger.d(message); void info(String message) => _logger.i(message); void warning(String message) => _logger.w(message); void error(String message, {dynamic error, StackTrace? stackTrace}) => _logger.e(message, error: error, stackTrace: stackTrace); }
使用方式:
// 任意位置调用,始终获取同一个实例 AppLogger().debug("调试信息"); AppLogger().error("请求失败", error: err, stackTrace: stack);
选型建议
- 仅需要统一日志格式、无额外扩展需求,直接用顶层全局变量即可,足够简洁高效
- 需要自定义日志逻辑、后续要迭代日志能力,选择单例类封装更易维护
内容的提问来源于stack exchange,提问作者Mr. Oak
相关产品推荐
相关产品推荐

