import 'package:flutter/foundation.dart'; 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 'servisler/job_orkestratoru.dart'; import 'servisler/ltx/ltx_baglanti_servisi.dart'; import 'ui/studyo/gorunum_studio.dart'; import 'yonlendirici.dart'; class VideoStudyoApp extends ConsumerStatefulWidget { const VideoStudyoApp({super.key}); @override ConsumerState createState() => _VideoStudyoAppState(); } class _VideoStudyoAppState extends ConsumerState { @override void initState() { super.initState(); // Job orchestrator'a anlık LTX state okuma yetisi ver JobOrkestratoru.ornek.ltxKaynagiAyarla( () => ref.read(ltxBaglantiProvider), ); // İzleme modu durumunu okuyabilmesi için provider erişimi ver JobOrkestratoru.ornek.izlemeModuKaynagiAyarla( () => ref.read(izlemeModuProvider), ); // Uygulama başlar başlamaz LTX bağlantısını dene (arkaplanda) WidgetsBinding.instance.addPostFrameCallback((_) { ref.read(ltxBaglantiProvider.notifier).kesfet(); }); } @override Widget build(BuildContext context) { ThemeData? temaData; String? temaHata; try { final tema = ref.watch(temaProvider); temaData = tema.tema; } catch (e, st) { temaHata = '$e\n$st'; debugPrint('Tema build hatası: $temaHata'); } return MaterialApp.router( title: 'FikoYT Video Stüdyo', debugShowCheckedModeBanner: false, theme: temaData ?? ThemeData.dark(useMaterial3: true), // Türkçe locale + Material/Cupertino/Widgets locale destekleri locale: const Locale('tr', 'TR'), localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('tr', 'TR'), Locale('en', 'US'), ], routerConfig: yonlendirici, builder: (context, child) { if (temaHata != null) { return Material( color: const Color(0xFF0F1115), child: Padding( padding: const EdgeInsets.all(24), child: SelectableText( 'Tema hatası:\n\n$temaHata', style: const TextStyle( color: Colors.redAccent, fontFamily: 'monospace', fontSize: 12), ), ), ); } // Hata overlay'i — siyah/boş kalmasın diye yakalanan exception'ı göster return Stack( children: [ child ?? const SizedBox.shrink(), const Positioned( right: 12, bottom: 36, width: 480, child: _HataOverlay(), ), ], ); }, ); } } /// Yakalanan FlutterError'ı göstermek için sağ alt köşede 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(8), child: Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), 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), ), ), ), ], ), ), ); }, ); } }