flutter 带参数的Dart Singleton(全局应用程序日志记录器)

3duebb1j  于 2023-03-04  发布在  Flutter
关注(0)|答案(2)|浏览(159)

我想在我的应用中使用Logger库。我只想示例化它一次,这样我的应用中就有一致的格式。我还想避免示例化PrettyPrinter()多次:

// Where should I put this ?
var logger = Logger(
  printer: PrettyPrinter(
    methodCount: 2,
    colors: true,
  ),
);

做这件事的正确方法是什么?我应该只使用全局常量吗?有没有办法用单例来做这件事?

bis0qfac

bis0qfac1#

我定义了一个helper函数来获取Logger:

import 'package:logger/logger.dart';
import 'log_printer.dart';

Logger getLogger(String className) {
  return Logger(printer: SimpleLogPrinter(className));
}

然后在每个类中,我希望以日志为例:

class ProfileService with ChangeNotifier {
  static final _log = getLogger('ProfileService');

  Future<Profile> updateProfile(Profile profile) async {
    _log.v('updateProfile');
    ...
  }
  ...
}

另一个例子:

class AuthScreen extends StatelessWidget {
  final log = getLogger('AuthScreen');

  @override
  Widget build(BuildContext context) {
    log.v('build called');
    ...
  }
  ...
}
4ioopgfo

4ioopgfo2#

我更喜欢使用单例
这在Flutter中并不常见,但是在这个场景中选择它是非常有意义的。日志记录器必须在任何地方都可以访问,而不需要任何上下文。并且可以让它保持活动状态,直到应用程序生命周期结束。
我的建议是创建一个包含以下内容的文件log.dart

import 'package:logger/logger.dart';
Logger get logger => Log.instance;

class Log extends Logger {
  Log._() : super(printer: PrettyPrinter(printTime: true));
  static final instance = Log._();
}

然后,您可以在任何地方访问您的记录器:

logger.d('My debug message');

相关问题