Refactor screens to MVC architecture with modular widgets

- Extract business logic from screens into dedicated controllers
- Split large screen files into smaller, reusable widget components
- Add controllers for AddSubscriptionScreen and DetailScreen
- Create modular widgets for subscription and detail features
- Improve code organization and maintainability
- Remove duplicated code and improve reusability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-07-11 00:21:18 +09:00
parent 4731288622
commit 83c5e3d64e
56 changed files with 9092 additions and 4579 deletions

View File

@@ -1,14 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
import 'dart:math' as math;
import '../models/subscription_model.dart';
import '../screens/detail_screen.dart';
import 'website_icon.dart';
import 'app_navigator.dart';
import '../theme/app_colors.dart';
import 'package:provider/provider.dart';
import '../providers/subscription_provider.dart';
import 'glassmorphism_card.dart';
class SubscriptionCard extends StatefulWidget {
@@ -27,9 +22,6 @@ class _SubscriptionCardState extends State<SubscriptionCard>
with SingleTickerProviderStateMixin {
late AnimationController _hoverController;
bool _isHovering = false;
final double _initialElevation = 1.0;
final double _hoveredElevation = 3.0;
late SubscriptionProvider _subscriptionProvider;
@override
void initState() {
@@ -40,12 +32,6 @@ class _SubscriptionCardState extends State<SubscriptionCard>
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_subscriptionProvider =
Provider.of<SubscriptionProvider>(context, listen: false);
}
@override
void dispose() {
@@ -221,10 +207,6 @@ class _SubscriptionCardState extends State<SubscriptionCard>
child: AnimatedBuilder(
animation: _hoverController,
builder: (context, child) {
final elevation = _initialElevation +
(_hoveredElevation - _initialElevation) *
_hoverController.value;
final scale = 1.0 + (0.02 * _hoverController.value);
return Transform.scale(
@@ -337,10 +319,10 @@ class _SubscriptionCardState extends State<SubscriptionCard>
vertical: 3,
),
decoration: BoxDecoration(
gradient: LinearGradient(
gradient: const LinearGradient(
colors: [
const Color(0xFFFF6B6B),
const Color(0xFFFF8787),
Color(0xFFFF6B6B),
Color(0xFFFF8787),
],
),
borderRadius:
@@ -349,12 +331,12 @@ class _SubscriptionCardState extends State<SubscriptionCard>
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icon(
Icons.local_offer_rounded,
size: 11,
color: Colors.white,
),
const SizedBox(width: 3),
SizedBox(width: 3),
Text(
'이벤트',
style: TextStyle(
@@ -386,7 +368,7 @@ class _SubscriptionCardState extends State<SubscriptionCard>
),
child: Text(
widget.subscription.billingCycle,
style: TextStyle(
style: const TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: AppColors.textSecondary,
@@ -424,7 +406,7 @@ class _SubscriptionCardState extends State<SubscriptionCard>
decimalDigits: 0,
).format(widget
.subscription.monthlyCost),
style: TextStyle(
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: AppColors.textSecondary,
@@ -555,7 +537,7 @@ class _SubscriptionCardState extends State<SubscriptionCard>
if (widget.subscription.eventEndDate != null) ...[
Text(
'${widget.subscription.eventEndDate!.difference(DateTime.now()).inDays}일 남음',
style: TextStyle(
style: const TextStyle(
fontSize: 11,
color: AppColors.textSecondary,
),