Flutter颜色观察与日志记录插件color_observer_logger的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter颜色观察与日志记录插件color_observer_logger的使用

Color Logger

更多示例可以在这里获取。

与VSCode扩展程序配合使用
设置Observer bloc

更多详情可以在这里查看。

// 显示堆栈跟踪
// 如果使用 'flutter build apk --obfuscate' 
// 则设置 stackTracking = false;

// AnsiColor.showColor();
Logger.root.level = Level.ALL;
Bloc.observer = ColorBlocObserver(
  stackTracking: true,
  kIsWeb: kIsWeb,
  filter: ShowWhenFilter(
    [
      "TestLoginBloc",
      "TestCubit",
    ],
  ),
  blocColor: AnsiColor.fg(40),
  methodCount: 3,
  blocHighLightFilter: DefaultHighLightFilter(
    color: AnsiColor.fg(214),
    colorOnly: false,
  ),
);
日志过滤器
  • 更多详情可以在这里查看。
  • 当字符串包含特定值时触发。
class ShowWhenFilter extends Filter {
  ShowWhenFilter(List<String> name) : super(name);
}

class HideWhenFilter extends Filter {
  HideWhenFilter(List<String> name) : super(name);
}
高亮过滤器
  • 更多详情可以在这里查看。
  • 当过滤器返回true时,高亮消息并使用颜色。
class DefaultHighLightFilter extends BlocHighLightFilter {
  [@override](/user/override)
  bool filter(String message) {
    return message.toLowerCase().contains('error') ||
           message.toLowerCase().contains('fail') ||
           message.toLowerCase().contains('exception');
  }
}

bloc

  • 不追踪 不追踪

  • 追踪 追踪

  • 错误 错误

  • 错误追踪 错误追踪

cubit

  • 不追踪 不追踪

  • 追踪 追踪

示例代码

import 'package:color_observer_logger/color_observer_logger.dart';
import 'package:example/bloc/test_bloc.dart';
import 'package:example/bloc/test_cubit.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:logging/logging.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    //AnsiColor.showColor();
    Logger.root.level = Level.ALL;
    Bloc.observer = ColorBlocObserver(
      stackTracking: true,
      kIsWeb: kIsWeb,
      filter: ShowWhenFilter(
        [
          "TestLoginBloc",
          "TestCubit",
        ],
      ),
      blocColor: AnsiColor.fg(40),
      methodCount: 3,
      blocHighLightFilter: DefaultHighLightFilter(
        color: AnsiColor.fg(214),
        colorOnly: false,
      ),
    );
    final testLoginBloc = TestLoginBloc();
    final testCubit = TestCubit(0);
    return MultiBlocProvider(
      providers: [
        BlocProvider(
          create: (context) => testLoginBloc,
        ),
        BlocProvider(
          create: (context) => testCubit,
        ),
      ],
      child: Builder(builder: (context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final testLoginBloc = context.read<TestLoginBloc>();
    final testCubit = context.read<TestCubit>();
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                testLoginBloc.add(Success());
                testLoginBloc.add(Failed());
              },
              child: Text("testLoginBloc"),
            ),
            ElevatedButton(
              onPressed: () {
                List.generate(5, (index) => testCubit.update());
              },
              child: Text("testCubit"),
            ),
            ElevatedButton(
              onPressed: () {
                testLoginBloc.add(Error());
                testCubit.error();
              },
              child: Text("error"),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter颜色观察与日志记录插件color_observer_logger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter颜色观察与日志记录插件color_observer_logger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用color_observer_logger插件的一个代码示例。请注意,这个插件是一个假设的插件,因为实际上Flutter社区可能没有这样一个具体命名的插件。不过,我会根据需求模拟一个类似功能的实现,包括颜色观察和日志记录。

首先,我们需要假设有一个color_observer_logger插件,它可以观察Widget树中的颜色变化并记录日志。由于这个插件不存在,我们将通过创建一个自定义的Widget和日志记录系统来模拟这个功能。

1. 创建自定义ColorObserverLogger

我们可以创建一个自定义的ColorObserverLogger类,用于观察和记录颜色变化。

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'dart:developer' as developer;

class ColorObserverLogger extends StatefulWidget {
  final Widget child;

  ColorObserverLogger({required this.child});

  @override
  _ColorObserverLoggerState createState() => _ColorObserverLoggerState();
}

class _ColorObserverLoggerState extends State<ColorObserverLogger> {
  Color? _previousColor;

  void _logColorChange(Color newColor) {
    if (_previousColor != null && _previousColor != newColor) {
      developer.log('Color changed from $_previousColor to $newColor');
    }
    _previousColor = newColor;
  }

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (context, constraints) {
        final renderBox = context.findRenderObject() as RenderBox?;
        final color = _extractColorFromRenderBox(renderBox);
        _logColorChange(color ?? Colors.transparent);
        return widget.child;
      },
    );
  }

  Color? _extractColorFromRenderBox(RenderBox? renderBox) {
    // 这是一个简化的示例,实际上你可能需要更复杂的逻辑来从RenderBox中提取颜色。
    // 这里我们假设RenderBox有一个特定的颜色属性(这在实际中是不存在的)。
    // 实际情况中,你可能需要遍历RenderBox的子树或使用其他方法来获取颜色。
    return null; // 替换为实际的颜色提取逻辑
  }
}

2. 使用ColorObserverLogger

接下来,我们可以在我们的Flutter应用中使用这个ColorObserverLogger来观察Widget树中的颜色变化。

import 'package:flutter/material.dart';
import 'color_observer_logger.dart'; // 假设我们的自定义类在这个文件中

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Color Observer Logger Demo'),
        ),
        body: Center(
          child: ColorObserverLogger(
            child: Container(
              width: 100,
              height: 100,
              color: Colors.blue, // 这里我们改变颜色来触发日志记录
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 动态改变颜色以演示日志记录
            setState(() {
              // 这里我们假设有一个机制来动态改变Container的颜色
              // 在实际应用中,这可能会涉及到状态管理或其他逻辑
            });
          },
          tooltip: 'Change Color',
          child: Icon(Icons.color_lens),
        ),
      ),
    );
  }
}

注意

  1. 颜色提取:上面的_extractColorFromRenderBox方法是一个占位符。在实际应用中,从RenderBox中提取颜色可能涉及更复杂的逻辑,甚至可能需要自定义RenderObject或使用其他技术。

  2. 动态颜色改变:在上面的示例中,FloatingActionButtononPressed回调只是一个占位符。在实际应用中,你需要实现一个机制来动态改变Widget的颜色。

  3. 日志记录:上面的示例使用developer.log来进行日志记录。这是Flutter提供的一个简单的日志记录机制。根据你的需求,你可能希望使用更复杂的日志记录系统,比如将日志发送到远程服务器或使用第三方日志库。

由于color_observer_logger插件是一个假设的插件,上面的代码提供了一个自定义的解决方案来模拟所需的功能。如果你找到一个具体的插件,它的用法可能会有所不同,但上面的代码提供了一个很好的起点,展示了如何在Flutter中实现类似的功能。

回到顶部