Talker Documentation

repository·master·Indexed 21 days ago

https://github.com/frezyx/talker

An advanced error handler and logger for Dart and Flutter applications. Talker provides tools for logging app actions, catching exceptions, and displaying UI alerts. It includes specialized logging packages for popular libraries, including talker_bloc_logger for BLoC, talker_dio_logger for Dio, talker_chopper_logger for Chopper, talker_grpc_logger for gRPC, and talker_http_logger for HTTP requests.

Tokens
21.8K
Snippets
89
Records
95
Agent score
74%

What's inside Talker

  1. Overview of Talker packages

    master

    Talker is a modular ecosystem for advanced error handling and logging in Dart and Flutter. It consists of several specialized packages depending on your needs:

    • talker: The core Dart package for logging and error handling.
    • talker_flutter: Flutter-specific extensions including colored logs, a logs list screen, UI error alerts, and route observers.
    • talker_logger: A customizable pretty logger.
    • Integration Loggers:
      • talker_dio_logger: For dio HTTP calls.
      • talker_bloc_logger: For bloc state management.
      • talker_riverpod_logger: For riverpod state management.
      • talker_chopper_logger: For chopper HTTP calls.
      • talker_http_logger: For the http package.
      • talker_grpc_logger: For grpc calls.
  2. Features of Talker

    master

    Talker provides a comprehensive suite of logging and error handling capabilities, specifically optimized for Flutter applications. Key features include:

    Logging

    • Filtering & Formatting: Customize how logs are displayed and which ones are captured.
    • Color Logs: Support for color-coded logs across Android, Windows, Web, iOS, and MacOS.
    • LogLevels: Support for info, verbose, warning, debug, error, critical, fine, and good.
    • History: Capability to save logs and error history.

    Error Handling

    • Identification: Automatic identification of Errors and Exceptions.
    • StackTraces: Full stack trace capture for debugging.

    Flutter Integration

    • UI Components:
      • TalkerScreen: Displays a list of logs within the app UI.
      • TalkerMonitor: Shows a summary of application status (e.g., error and warning counts).
      • TalkerWrapper: Displays error and exception messages directly in the UI.
      • TalkerBuilder: Allows building custom UI for the logs list.
    • Observability:
      • TalkerRouteObserver: Logs router activity (screen opening/closing).
      • TalkerListener: Listen to log data within the application UI.
    • Network: Logging of HTTP calls.

    Integrations

    • TalkerObserver: Enables handling logs, errors, and exceptions for external integrations like Sentry and Crashlytics.
  3. Observe Talker events with TalkerObserver

    master

    Use TalkerObserver to intercept and react to internal Talker events. This is useful for transmitting logs, errors, or exceptions to external services like Sentry, Crashlytics, or Grafana.

    Override the following methods in your implementation:

    • onError(TalkerError err)
    • onException(TalkerException exception)
    • onLog(TalkerDataInterface log)
    import 'package:talker/talker.dart';
    
    class ExampleTalkerObserver extends TalkerObserver {
      @override
      void onError(TalkerError err) {
        /// Send data to your error tracking system
        super.onError(err);
      }
    
      @override
      void onException(TalkerException exception) {
        /// Send Exception to your error tracking system
        super.onException(exception);
      }
    
      @override
      void onLog(TalkerDataInterface log) {
        /// Send log message to Grafana or backend
        super.onLog(log);
      }
    }
    
    final observer = ExampleTalkerObserver();
    final talker = Talker(observer: observer);
  4. Setup Talker Riverpod Logger

    master

    Use talker_riverpod_logger to log Riverpod event calls and state emissions.

    1. Add the dependency:
    dependencies:
      talker_riverpod_logger: ^5.1.20
    1. Register the TalkerRiverpodObserver in your ProviderScope (for Flutter apps) or ProviderContainer (for pure Dart apps).
    import 'package:talker_riverpod_logger/talker_riverpod_logger.dart';
    
    // For Flutter apps
    runApp(
      ProviderScope(
        observers: [
          TalkerRiverpodObserver(),
        ],
        child: MyApp(),
      )
    );
    
    // For pure Dart apps
    final container = ProviderContainer(
      observers: [
        TalkerRiverpodObserver(),
      ],
    );
  5. Integrate with an existing Talker instance

    master

    To ensure HTTP logs are integrated into your existing centralized logging system, pass your existing Talker instance to the talker parameter of TalkerChopperLogger.

    final talker = Talker();
    final client = ChopperClient(
      /// ... other chopper settings
      interceptors: [
        TalkerChopperLogger(
          talker: talker,
          settings: const TalkerChopperLoggerSettings(
            printRequestHeaders: true,
            printResponseHeaders: true,
            printResponseMessage: true,
          ),
        ),
      ],
    );
  6. Integrate TalkerDioLogger with Dio

    master

    The talker_dio_logger package provides a lightweight way to log HTTP requests and responses using dio. You can add it as an interceptor to your Dio instance.

    Key Features:

    • Toggle Logging: Control whether request/response data and headers are printed using TalkerDioLoggerSettings.
    • Custom Colors: Set ANSI colors for the console using AnsiPen (requestPen, responsePen, errorPen).
    • Filtering: Use requestFilter and responseFilter to exclude specific requests (e.g., by path or status code) from being logged.
    • Unified Tracking: Pass an existing Talker instance to TalkerDioLogger(talker: talker) to centralize all logs.
    // Basic Usage
    final dio = Dio();
    dio.interceptors.add(
        TalkerDioLogger(
            settings: const TalkerDioLoggerSettings(
              printRequestHeaders: true,
              printResponseHeaders: true,
              printResponseMessage: true,
            ),
        ),
    );
    
    // Advanced Configuration (Filtering and Colors)
    dio.interceptors.add(
        TalkerDioLogger(
            settings: TalkerDioLoggerSettings(
              printResponseData: true,
              printRequestData: false,
              requestFilter: (options) => !options.path.contains('/secure'),
              responseFilter: (response) => response.statusCode != 301,
              requestPen: AnsiPen()..blue(),
              responsePen: AnsiPen()..green(),
              errorPen: AnsiPen()..red(),
            ),
        ),
    );
    
    // Using with an existing Talker instance
    final talker = Talker();
    dio.interceptors.add(TalkerDioLogger(talker: talker));
  7. Run the talker_riverpod_logger example

    master

    The example project demonstrates how to use riverpod in a pure Dart environment (without Flutter) and how to handle asynchronous provider dependencies.

    To run the example, you must first configure your Marvel API credentials in models.dart and then generate the necessary build files.

    // 1. Update models.dart with your Marvel API credentials
    final hash = md5
            .convert(
              utf8.encode(
                '$timestamp${"<your private key>"}${"<your public key>"}',
              ),
            )
            .toString();
    
    final result = await _client.get<Map<String, Object?>>(
          'http://gateway.marvel.com/v1/public/comics',
          queryParameters: <String, Object?>{
            'ts': timestamp,
            'apikey': "<your public key>",
            'hash': hash,
          },
        );
    
    // 2. Generate files
    dart run build_runner build --delete-conflicting-outputs
  8. Track page transitions with TalkerRouteObserver

    master

    Use TalkerRouteObserver to record page transitions in your application. It is compatible with standard Flutter Navigator and popular routing packages like auto_route and go_router.

    // Standard Navigator
    final talker = Talker();
    MaterialApp(
      navigatorObservers: [
        TalkerRouteObserver(talker),
      ],
    )
    
    // go_router
    final talker = Talker();
    GoRouter(
      observers: [TalkerRouteObserver(talker)],
    )
    
    // auto_route v7
    final talker = Talker();
    MaterialApp.router(
      routerConfig: _appRouter.config(
        navigatorObservers: () => [
          TalkerRouteObserver(talker),
        ],
      ),
    ),