import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'durum/tema_durumu.dart'; import 'main.dart' show sonHataDetay; import 'yonlendirici.dart'; class FikoFilmApp extends ConsumerWidget { const FikoFilmApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final modu = ref.watch(temaProvider); final sistem = MediaQuery.platformBrightnessOf(context); return MaterialApp.router( title: 'Fiko Film Stüdyosu', debugShowCheckedModeBanner: false, theme: temaCozumle(modu, sistem), darkTheme: temaCozumle(TemaModu.koyu, Brightness.dark), themeMode: switch (modu) { TemaModu.acik => ThemeMode.light, TemaModu.koyu => ThemeMode.dark, TemaModu.sistem => ThemeMode.system, }, locale: const Locale('tr', 'TR'), localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('tr', 'TR'), Locale('en', 'US'), ], routerConfig: yonlendirici, builder: (ctx, child) { return Stack( children: [ child ?? const SizedBox.shrink(), const Positioned( right: 12, bottom: 12, width: 480, child: _HataOverlay(), ), ], ); }, ); } } /// Yakalanan FlutterError'ı sağ alt köşede gösteren kayan kart. class _HataOverlay extends StatelessWidget { const _HataOverlay(); @override Widget build(BuildContext context) { return ValueListenableBuilder( valueListenable: sonHataDetay, builder: (ctx, detay, _) { if (detay == null) return const SizedBox.shrink(); return Material( elevation: 12, color: const Color(0xFF2A0000), borderRadius: BorderRadius.circular(10), child: Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), border: Border.all(color: Colors.redAccent, width: 1.5), ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ const Icon(Icons.error_outline, color: Colors.redAccent, size: 18), const SizedBox(width: 6), const Expanded( child: Text( 'Yakalanan Hata', style: TextStyle( color: Colors.redAccent, fontWeight: FontWeight.bold, ), ), ), IconButton( icon: const Icon(Icons.close, color: Colors.white70, size: 16), tooltip: 'Kapat', padding: EdgeInsets.zero, constraints: const BoxConstraints( minWidth: 24, minHeight: 24), onPressed: () => sonHataDetay.value = null, ), ], ), const SizedBox(height: 6), ConstrainedBox( constraints: const BoxConstraints(maxHeight: 240), child: SingleChildScrollView( child: SelectableText( '${detay.exception}\n\n${detay.stack ?? ""}', style: const TextStyle( color: Colors.white, fontFamily: 'monospace', fontSize: 10, ), ), ), ), ], ), ), ); }, ); } }