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:
JiWoong Sul
2025-07-10 18:36:57 +09:00
parent 8619e96739
commit 4731288622
55 changed files with 8219 additions and 2149 deletions

106
lib/routes/app_routes.dart Normal file
View File

@@ -0,0 +1,106 @@
import 'package:flutter/material.dart';
import 'package:submanager/screens/main_screen.dart';
import 'package:submanager/screens/add_subscription_screen.dart';
import 'package:submanager/screens/detail_screen.dart';
import 'package:submanager/screens/sms_scan_screen.dart';
import 'package:submanager/screens/analysis_screen.dart';
import 'package:submanager/screens/settings_screen.dart';
import 'package:submanager/screens/splash_screen.dart';
import 'package:submanager/models/subscription_model.dart';
class AppRoutes {
static const String splash = '/splash';
static const String main = '/';
static const String addSubscription = '/add-subscription';
static const String subscriptionDetail = '/subscription-detail';
static const String smsScanner = '/sms-scanner';
static const String analysis = '/analysis';
static const String settings = '/settings';
static Map<String, WidgetBuilder> getRoutes() {
return {
splash: (context) => const SplashScreen(),
main: (context) => const MainScreen(),
addSubscription: (context) => const AddSubscriptionScreen(),
smsScanner: (context) => const SmsScanScreen(),
analysis: (context) => const AnalysisScreen(),
settings: (context) => const SettingsScreen(),
};
}
static Route<dynamic> generateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case splash:
return _buildRoute(const SplashScreen(), routeSettings);
case main:
return _buildRoute(const MainScreen(), routeSettings);
case addSubscription:
return _buildRoute(const AddSubscriptionScreen(), routeSettings);
case subscriptionDetail:
final subscription = routeSettings.arguments as SubscriptionModel?;
if (subscription != null) {
return _buildRoute(DetailScreen(subscription: subscription), routeSettings);
}
return _errorRoute();
case smsScanner:
return _buildRoute(const SmsScanScreen(), routeSettings);
case analysis:
return _buildRoute(const AnalysisScreen(), routeSettings);
case settings:
return _buildRoute(const SettingsScreen(), routeSettings);
default:
return _errorRoute();
}
}
static Route<dynamic> _buildRoute(Widget page, RouteSettings settings) {
return MaterialPageRoute(
builder: (_) => page,
settings: settings,
);
}
static Route<dynamic> _errorRoute() {
return MaterialPageRoute(
builder: (_) => const Scaffold(
body: Center(
child: Text('페이지를 찾을 수 없습니다'),
),
),
);
}
static void navigateTo(BuildContext context, String routeName, {Object? arguments}) {
Navigator.pushNamed(context, routeName, arguments: arguments);
}
static void navigateAndReplace(BuildContext context, String routeName, {Object? arguments}) {
Navigator.pushReplacementNamed(context, routeName, arguments: arguments);
}
static void navigateAndRemoveUntil(BuildContext context, String routeName, {Object? arguments}) {
Navigator.pushNamedAndRemoveUntil(
context,
routeName,
(route) => false,
arguments: arguments,
);
}
static void pop(BuildContext context, {dynamic result}) {
if (Navigator.canPop(context)) {
Navigator.pop(context, result);
}
}
static bool canPop(BuildContext context) {
return Navigator.canPop(context);
}
}