import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:video_player_win/video_player_win_plugin.dart'; import 'package:window_manager/window_manager.dart'; import 'app.dart'; import 'cekirdek/sabitler.dart'; import 'servisler/job_orkestratoru.dart'; /// Son yakalanan ölümcül hata — UI overlay'inde gösterilir. final ValueNotifier sonHataDetay = ValueNotifier(null); Future main() async { WidgetsFlutterBinding.ensureInitialized(); // Tüm Flutter ve async hatalarını yakala — siyah ekran/sessiz çökme yerine // gerçek hatayı ekrana bastır. FlutterError.onError = (details) { FlutterError.presentError(details); sonHataDetay.value = details; }; PlatformDispatcher.instance.onError = (error, stack) { debugPrint('PlatformDispatcher hatası: $error\n$stack'); sonHataDetay.value = FlutterErrorDetails( exception: error, stack: stack, library: 'PlatformDispatcher', ); return true; }; // ErrorWidget — render hatası olduğunda kırmızı yama yerine okunaklı kart. ErrorWidget.builder = (details) { sonHataDetay.value = details; return Material( color: const Color(0xFF1A0000), child: Padding( padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Widget render hatası', style: TextStyle( color: Colors.redAccent, fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 12), Expanded( child: SingleChildScrollView( child: SelectableText( '${details.exception}\n\n${details.stack}', style: const TextStyle( color: Colors.white70, fontFamily: 'monospace', fontSize: 11, ), ), ), ), ], ), ), ); }; String? baslatmaHatasi; // --- Hive --- try { await Hive.initFlutter(); await Future.wait([ Hive.openBox(FikoSabitler.boxJoblar), Hive.openBox(FikoSabitler.boxKarakterler), Hive.openBox(FikoSabitler.boxFilmler), Hive.openBox(FikoSabitler.boxSablonlar), Hive.openBox(FikoSabitler.boxAyarlar), Hive.openBox(FikoSabitler.boxPromptGecmisi), ]); } catch (e, st) { baslatmaHatasi = 'Hive init: $e\n$st'; debugPrint(baslatmaHatasi); } // --- Pencere --- try { await Window.initialize(); await windowManager.ensureInitialized(); WindowsVideoPlayer.registerWith(); await windowManager.waitUntilReadyToShow( const WindowOptions( size: Size(1480, 920), minimumSize: Size(1024, 720), center: true, backgroundColor: Colors.transparent, titleBarStyle: TitleBarStyle.normal, title: FikoSabitler.pencereBaslik, ), () async { // Acrylic mica — desteklenmezse sessizce geç. try { await Window.setEffect(effect: WindowEffect.mica, dark: true); } catch (_) { try { await Window.setEffect(effect: WindowEffect.acrylic, dark: true); } catch (_) {} } await windowManager.show(); await windowManager.focus(); }, ); } catch (e, st) { baslatmaHatasi ??= 'Pencere init: $e\n$st'; debugPrint('Pencere init: $e\n$st'); } // --- Job Orchestrator --- try { await JobOrkestratoru.ornek.baslat(); } catch (e, st) { debugPrint('JobOrkestratoru baslat: $e\n$st'); } // Render pipeline test ekranı — sadece kritik başlatma hatası varsa. if (baslatmaHatasi != null) { runApp(MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( backgroundColor: const Color(0xFF0F1115), body: Padding( padding: const EdgeInsets.all(40), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Fiko Film Stüdyosu — Başlatma Hatası', style: TextStyle( color: Colors.redAccent, fontSize: 22, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), Expanded( child: SingleChildScrollView( child: SelectableText( baslatmaHatasi, style: const TextStyle( color: Colors.white70, fontFamily: 'monospace', fontSize: 12, ), ), ), ), ], ), ), ), )); return; } runApp(const ProviderScope(child: FikoFilmApp())); }