Major UI/UX and architecture improvements
- Implemented new navigation system with NavigationProvider and route management - Added adaptive theme system with ThemeProvider for better theme handling - Introduced glassmorphism design elements (app bars, scaffolds, cards) - Added advanced animations (spring animations, page transitions, staggered lists) - Implemented performance optimizations (memory manager, lazy loading) - Refactored Analysis screen into modular components - Added floating navigation bar with haptic feedback - Improved subscription cards with swipe actions - Enhanced skeleton loading with better animations - Added cached network image support - Improved overall app architecture and code organization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,27 +1,28 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
import 'package:flutter/foundation.dart' show kIsWeb, kDebugMode;
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'models/subscription_model.dart';
|
||||
import 'models/category_model.dart';
|
||||
import 'providers/subscription_provider.dart';
|
||||
import 'providers/app_lock_provider.dart';
|
||||
import 'providers/notification_provider.dart';
|
||||
import 'screens/main_screen.dart';
|
||||
import 'screens/app_lock_screen.dart';
|
||||
import 'providers/navigation_provider.dart';
|
||||
import 'services/notification_service.dart';
|
||||
import 'providers/category_provider.dart';
|
||||
import 'providers/locale_provider.dart';
|
||||
import 'providers/theme_provider.dart';
|
||||
import 'l10n/app_localizations.dart';
|
||||
import 'theme/app_theme.dart';
|
||||
import 'screens/splash_screen.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'theme/adaptive_theme.dart';
|
||||
import 'routes/app_routes.dart';
|
||||
import 'navigation/app_navigation_observer.dart';
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
import 'package:google_mobile_ads/google_mobile_ads.dart';
|
||||
import 'dart:io' show Platform;
|
||||
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
import 'utils/memory_manager.dart';
|
||||
import 'utils/performance_optimizer.dart';
|
||||
import 'navigator_key.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
@@ -31,17 +32,25 @@ Future<void> main() async {
|
||||
await MobileAds.instance.initialize();
|
||||
}
|
||||
|
||||
// 성능 최적화 설정
|
||||
MemoryManager.optimizeImageCache();
|
||||
MemoryManager().startAutoCleanup();
|
||||
|
||||
// 앱 시작 시 이미지 캐시 관리
|
||||
try {
|
||||
// 메모리 이미지 캐시는 유지하지만 필요한 경우 삭제할 수 있도록 준비
|
||||
final cache = PaintingBinding.instance.imageCache;
|
||||
|
||||
// 오래된 디스크 캐시 파일만 지우기 (새로운 것은 유지)
|
||||
await DefaultCacheManager().emptyCache();
|
||||
|
||||
print('이미지 캐시 관리 초기화 완료');
|
||||
if (kDebugMode) {
|
||||
print('이미지 캐시 관리 초기화 완료');
|
||||
PerformanceOptimizer.checkConstOptimization();
|
||||
}
|
||||
} catch (e) {
|
||||
print('캐시 초기화 오류: $e');
|
||||
if (kDebugMode) {
|
||||
print('캐시 초기화 오류: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Hive 초기화
|
||||
@@ -58,11 +67,14 @@ Future<void> main() async {
|
||||
final categoryProvider = CategoryProvider();
|
||||
final localeProvider = LocaleProvider();
|
||||
final notificationProvider = NotificationProvider();
|
||||
final themeProvider = ThemeProvider();
|
||||
final navigationProvider = NavigationProvider();
|
||||
|
||||
await subscriptionProvider.init();
|
||||
await categoryProvider.init();
|
||||
await localeProvider.init();
|
||||
await notificationProvider.init();
|
||||
await themeProvider.initialize();
|
||||
|
||||
// NotificationProvider에 SubscriptionProvider 연결 (알림 재예약용)
|
||||
// SRP 원칙에 따라 다른 Provider 객체를 명시적으로 주입
|
||||
@@ -89,6 +101,8 @@ Future<void> main() async {
|
||||
ChangeNotifierProvider(create: (_) => AppLockProvider(appLockBox)),
|
||||
ChangeNotifierProvider(create: (_) => notificationProvider),
|
||||
ChangeNotifierProvider(create: (_) => localeProvider),
|
||||
ChangeNotifierProvider(create: (_) => themeProvider),
|
||||
ChangeNotifierProvider(create: (_) => navigationProvider),
|
||||
],
|
||||
child: const SubManagerApp(),
|
||||
),
|
||||
@@ -100,12 +114,15 @@ class SubManagerApp extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<LocaleProvider>(
|
||||
builder: (context, localeProvider, child) {
|
||||
return Consumer2<LocaleProvider, ThemeProvider>(
|
||||
builder: (context, localeProvider, themeProvider, child) {
|
||||
// 시스템 UI 오버레이 스타일 적용
|
||||
AdaptiveTheme.applySystemUIOverlay(context);
|
||||
|
||||
return MaterialApp(
|
||||
title: 'SubManager',
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: AppTheme.lightTheme,
|
||||
theme: themeProvider.getTheme(context),
|
||||
locale: localeProvider.locale,
|
||||
localizationsDelegates: const [
|
||||
AppLocalizationsDelegate(),
|
||||
@@ -118,7 +135,24 @@ class SubManagerApp extends StatelessWidget {
|
||||
Locale('ko'),
|
||||
],
|
||||
navigatorKey: navigatorKey,
|
||||
home: const SplashScreen(),
|
||||
navigatorObservers: [AppNavigationObserver()],
|
||||
initialRoute: AppRoutes.splash,
|
||||
routes: AppRoutes.getRoutes(),
|
||||
onGenerateRoute: AppRoutes.generateRoute,
|
||||
builder: (context, child) {
|
||||
// 성능 최적화 및 메모리 관리
|
||||
if (kDebugMode) {
|
||||
PerformanceOptimizer().startFrameMonitoring();
|
||||
}
|
||||
|
||||
return MediaQuery(
|
||||
data: MediaQuery.of(context).copyWith(
|
||||
textScaler: TextScaler.linear(themeProvider.largeText ? 1.2 : 1.0),
|
||||
disableAnimations: themeProvider.reduceMotion,
|
||||
),
|
||||
child: child!,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user