loguinho 1.0.1 copy "loguinho: ^1.0.1" to clipboard
loguinho: ^1.0.1 copied to clipboard

Framework de logging estruturado, seguro, de alta performance e multiplataforma para aplicações Dart e Flutter.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:loguinho/loguinho.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 1. Configura o Loguinho para o ambiente de desenvolvimento
  Loguinho.configure(LoggerConfig.development());
  Loguinho.setSessionId('sess_demo_123456');
  Loguinho.setUserId('desenvolvedor@flubit.dev');

  runApp(const LoguinhoDemoApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Loguinho Demo App',
      debugShowCheckedModeBanner: false,
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: const Color(0xFF090D16),
        colorScheme: const ColorScheme.dark(
          primary: Color(0xFF38BDF8),
          surface: Color(0xFF111827),
        ),
      ),
      // Interceptador automático de navegação/rotas
      navigatorObservers: [LoguinhoNavigatorObserver()],
      // Envolve a aplicação no LoguinhoOverlay (botão flutuante 🪵)
      builder: (context, child) => LoguinhoOverlay(child: child),
      initialRoute: '/',
      routes: {
        '/': (context) => const DemoHomePage(),
        '/details': (context) => const DemoDetailsPage(),
      },
    );
  }
}

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

  void _triggerAllLogLevels() {
    Loguinho.debug('🔍 Log de Depuração (Debug)', category: 'SYSTEM');
    Loguinho.info('ℹ️ Usuário visualizou a tela principal', category: 'UI');
    Loguinho.success('✅ Operação concluída com sucesso', category: 'SYSTEM');
    Loguinho.warning('⚠️ Alerta de consumo de memória', category: 'PERF', attributes: {'usedMb': 320});
    Loguinho.error('❌ Falha ao carregar preferências do usuário', category: 'STORAGE', error: 'FileNotFoundException');
    Loguinho.fatal('💥 Exceção fatal não tratada na engine', category: 'CORE', error: 'StateError: Out of memory');
    Loguinho.security('🔒 Tentativa de autenticação com CPF 123.456.789-00', category: 'AUTH', attributes: {'password': 'SenhaSecreta123'});
    Loguinho.performance('⚡ Renderização da Home executada', category: 'PERF', attributes: {'fps': 60, 'durationMs': 12});

    // Simulação HTTP REST
    LoguinhoHttpInterceptor.logRequest(method: 'POST', url: 'https://api.flubit.dev/v1/auth', body: {'email': 'user@flubit.dev'});
    LoguinhoHttpInterceptor.logResponse(method: 'POST', url: 'https://api.flubit.dev/v1/auth', statusCode: 200, durationMs: 95);

    Loguinho.database('🗄️ Executada query SQL SELECT * FROM users', category: 'DATABASE');
    Loguinho.analytics('📊 Evento de clique no botão principal disparado', category: 'ANALYTICS');
    Loguinho.audit('📜 Termos de serviço aceitos pelo usuário', category: 'AUDIT');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('🪵 Loguinho Inspector Demo', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
        backgroundColor: const Color(0xFF111827),
        elevation: 0,
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(20),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            // Card Explicativo
            Container(
              padding: const EdgeInsets.all(16),
              decoration: BoxDecoration(
                color: const Color(0xFF111827),
                borderRadius: BorderRadius.circular(16),
                border: Border.all(color: const Color(0xFF1E293B)),
              ),
              child: const Column(
                children: [
                  Text('🪵', style: TextStyle(fontSize: 36)),
                  SizedBox(height: 8),
                  Text(
                    'Demonstração Interativa do Loguinho',
                    style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
                  ),
                  SizedBox(height: 6),
                  Text(
                    'Toque no botão flutuante no canto da tela (ou no botão abaixo) para abrir o Loguinho Inspector e testar os filtros por Nível (12 LogLevels), Busca e Detalhes.',
                    textAlign: TextAlign.center,
                    style: TextStyle(color: Colors.grey, fontSize: 12, height: 1.4),
                  ),
                ],
              ),
            ),
            const SizedBox(height: 24),

            // Botão Principal: Disparar todos os 12 LogLevels
            ElevatedButton.icon(
              style: ElevatedButton.styleFrom(
                backgroundColor: const Color(0xFF0284C7),
                foregroundColor: Colors.white,
                padding: const EdgeInsets.symmetric(vertical: 14),
                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
              ),
              onPressed: () {
                _triggerAllLogLevels();
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('✨ Logs gerados para todos os 12 LogLevels! Toque no botão 🪵 para inspecionar.'),
                    duration: Duration(seconds: 2),
                  ),
                );
              },
              icon: const Icon(Icons.flash_on_rounded, size: 20),
              label: const Text('Disparar Todos os 12 LogLevels', style: TextStyle(fontWeight: FontWeight.bold)),
            ),
            const SizedBox(height: 12),

            // Botão: Abrir Inspetor Direto
            OutlinedButton.icon(
              style: OutlinedButton.styleFrom(
                foregroundColor: const Color(0xFF38BDF8),
                side: const BorderSide(color: Color(0xFF38BDF8)),
                padding: const EdgeInsets.symmetric(vertical: 14),
                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
              ),
              onPressed: () => LoguinhoInspectorScreen.show(context),
              icon: const Text('🪵', style: TextStyle(fontSize: 18)),
              label: const Text('Abrir Loguinho Inspector Screen', style: TextStyle(fontWeight: FontWeight.bold)),
            ),
            const SizedBox(height: 12),

            // Botão: Testar Navegação de Rota
            OutlinedButton.icon(
              style: OutlinedButton.styleFrom(
                foregroundColor: Colors.white,
                side: const BorderSide(color: Color(0xFF374151)),
                padding: const EdgeInsets.symmetric(vertical: 14),
                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
              ),
              onPressed: () => Navigator.pushNamed(context, '/details'),
              icon: const Icon(Icons.alt_route_rounded, size: 20),
              label: const Text('Navegar para Tela de Detalhes (Testa Observer)', style: TextStyle(fontWeight: FontWeight.bold)),
            ),
            const SizedBox(height: 24),

            const Text('TESTES INDIVIDUAIS POR NÍVEL:', style: TextStyle(color: Colors.grey, fontSize: 11, fontWeight: FontWeight.bold, letterSpacing: 1)),
            const SizedBox(height: 10),

            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: [
                _buildLogButton('🔍 Debug', () => Loguinho.debug('Log de depuração manual', category: 'TEST')),
                _buildLogButton('ℹ️ Info', () => Loguinho.info('Log informativo manual', category: 'TEST')),
                _buildLogButton('✅ Success', () => Loguinho.success('Log de sucesso manual', category: 'TEST')),
                _buildLogButton('⚠️ Warning', () => Loguinho.warning('Alerta de aviso manual', category: 'TEST')),
                _buildLogButton('❌ Error', () => Loguinho.error('Erro de teste simulado', category: 'TEST', error: Exception('Erro manual'))),
                _buildLogButton('💥 Fatal', () => Loguinho.fatal('Erro fatal simulado', category: 'TEST')),
                _buildLogButton('🔒 Security', () => Loguinho.security('Autenticação com CPF 999.888.777-66', category: 'AUTH')),
                _buildLogButton('⚡ Perf', () => Loguinho.performance('Latência de renderização: 16ms', category: 'PERF')),
                _buildLogButton('🌐 Network', () => LoguinhoHttpInterceptor.logResponse(method: 'GET', url: 'https://api.flubit.dev/v1/users', statusCode: 200, durationMs: 45)),
                _buildLogButton('🗄️ Database', () => Loguinho.database('Query SQLite executada', category: 'DB')),
                _buildLogButton('📊 Analytics', () => Loguinho.analytics('Clique em botão cadastrado', category: 'ANALYTICS')),
                _buildLogButton('📜 Audit', () => Loguinho.audit('Auditoria de segurança gravada', category: 'AUDIT')),
              ],
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildLogButton(String label, VoidCallback onPressed) {
    return ActionChip(
      backgroundColor: const Color(0xFF1F2937),
      side: const BorderSide(color: Color(0xFF374151)),
      label: Text(label, style: const TextStyle(color: Colors.white, fontSize: 12)),
      onPressed: onPressed,
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Tela de Detalhes'),
        backgroundColor: const Color(0xFF111827),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Icon(Icons.check_circle_outline_rounded, color: Color(0xFF38BDF8), size: 64),
            const SizedBox(height: 16),
            const Text(
              'A rota foi interceptada pelo LoguinhoNavigatorObserver! 🧭',
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => Navigator.pop(context),
              child: const Text('Voltar para a Home'),
            ),
          ],
        ),
      ),
    );
  }
}
3
likes
145
points
188
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Framework de logging estruturado, seguro, de alta performance e multiplataforma para aplicações Dart e Flutter.

Homepage

License

MIT (license)

Dependencies

flutter, meta

More

Packages that depend on loguinho