style: apply dart format across project
This commit is contained in:
@@ -62,14 +62,14 @@ class _AddSubscriptionScreenState extends State<AddSubscriptionScreen>
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: MediaQuery.of(context).padding.top + 60),
|
||||
|
||||
|
||||
// 헤더 섹션
|
||||
AddSubscriptionHeader(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
|
||||
|
||||
// 서비스 정보 폼
|
||||
AddSubscriptionForm(
|
||||
controller: _controller,
|
||||
@@ -78,7 +78,7 @@ class _AddSubscriptionScreenState extends State<AddSubscriptionScreen>
|
||||
setState: setState,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
|
||||
// 이벤트/할인 섹션
|
||||
AddSubscriptionEventSection(
|
||||
controller: _controller,
|
||||
@@ -87,7 +87,7 @@ class _AddSubscriptionScreenState extends State<AddSubscriptionScreen>
|
||||
setState: setState,
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
|
||||
// 저장 버튼
|
||||
AddSubscriptionSaveButton(
|
||||
controller: _controller,
|
||||
@@ -101,4 +101,4 @@ class _AddSubscriptionScreenState extends State<AddSubscriptionScreen>
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,12 +43,14 @@ class _AnalysisScreenState extends State<AnalysisScreen>
|
||||
// Provider 변경 감지
|
||||
final provider = Provider.of<SubscriptionProvider>(context);
|
||||
final currentHash = _calculateDataHash(provider);
|
||||
|
||||
|
||||
debugPrint('[AnalysisScreen] didChangeDependencies: '
|
||||
'현재 해시=$currentHash, 이전 해시=$_lastDataHash, 로딩중=$_isLoading');
|
||||
|
||||
|
||||
// 데이터가 변경되었고 현재 로딩 중이 아닌 경우에만 리로드
|
||||
if (currentHash != _lastDataHash && !_isLoading && _lastDataHash.isNotEmpty) {
|
||||
if (currentHash != _lastDataHash &&
|
||||
!_isLoading &&
|
||||
_lastDataHash.isNotEmpty) {
|
||||
debugPrint('[AnalysisScreen] 데이터 변경 감지됨, 리로드 시작');
|
||||
_loadData();
|
||||
}
|
||||
@@ -65,15 +67,16 @@ class _AnalysisScreenState extends State<AnalysisScreen>
|
||||
String _calculateDataHash(SubscriptionProvider provider) {
|
||||
final subscriptions = provider.subscriptions;
|
||||
final buffer = StringBuffer();
|
||||
|
||||
|
||||
buffer.write(subscriptions.length);
|
||||
buffer.write('_');
|
||||
buffer.write(provider.totalMonthlyExpense.toStringAsFixed(2));
|
||||
|
||||
|
||||
for (final sub in subscriptions) {
|
||||
buffer.write('_${sub.id}_${sub.currentPrice.toStringAsFixed(2)}_${sub.currency}');
|
||||
buffer.write(
|
||||
'_${sub.id}_${sub.currentPrice.toStringAsFixed(2)}_${sub.currency}');
|
||||
}
|
||||
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
@@ -148,7 +151,7 @@ class _AnalysisScreenState extends State<AnalysisScreen>
|
||||
height: kToolbarHeight + MediaQuery.of(context).padding.top,
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
// 네이티브 광고 위젯
|
||||
SliverToBoxAdapter(
|
||||
child: _buildAnimatedAd(),
|
||||
@@ -197,4 +200,4 @@ class _AnalysisScreenState extends State<AnalysisScreen>
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,15 +90,35 @@ class _CategoryManagementScreenState extends State<CategoryManagementScreen> {
|
||||
),
|
||||
items: [
|
||||
DropdownMenuItem(
|
||||
value: '#1976D2', child: Text(AppLocalizations.of(context).colorBlue, style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: '#1976D2',
|
||||
child: Text(
|
||||
AppLocalizations.of(context).colorBlue,
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: '#4CAF50', child: Text(AppLocalizations.of(context).colorGreen, style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: '#4CAF50',
|
||||
child: Text(
|
||||
AppLocalizations.of(context).colorGreen,
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: '#FF9800', child: Text(AppLocalizations.of(context).colorOrange, style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: '#FF9800',
|
||||
child: Text(
|
||||
AppLocalizations.of(context).colorOrange,
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: '#F44336', child: Text(AppLocalizations.of(context).colorRed, style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: '#F44336',
|
||||
child: Text(
|
||||
AppLocalizations.of(context).colorRed,
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: '#9C27B0', child: Text(AppLocalizations.of(context).colorPurple, style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: '#9C27B0',
|
||||
child: Text(
|
||||
AppLocalizations.of(context).colorPurple,
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
],
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
@@ -117,14 +137,30 @@ class _CategoryManagementScreenState extends State<CategoryManagementScreen> {
|
||||
),
|
||||
items: [
|
||||
DropdownMenuItem(
|
||||
value: 'subscriptions', child: Text('구독', style: TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(value: 'movie', child: Text('영화', style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: 'subscriptions',
|
||||
child: Text('구독',
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: 'music_note', child: Text('음악', style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: 'movie',
|
||||
child: Text('영화',
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: 'fitness_center', child: Text('운동', style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: 'music_note',
|
||||
child: Text('음악',
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: 'shopping_cart', child: Text('쇼핑', style: TextStyle(color: AppColors.darkNavy))),
|
||||
value: 'fitness_center',
|
||||
child: Text('운동',
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
DropdownMenuItem(
|
||||
value: 'shopping_cart',
|
||||
child: Text('쇼핑',
|
||||
style:
|
||||
TextStyle(color: AppColors.darkNavy))),
|
||||
],
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
@@ -163,7 +199,8 @@ class _CategoryManagementScreenState extends State<CategoryManagementScreen> {
|
||||
int.parse(category.color.replaceAll('#', '0xFF'))),
|
||||
),
|
||||
title: Text(
|
||||
provider.getLocalizedCategoryName(context, category.name),
|
||||
provider.getLocalizedCategoryName(
|
||||
context, category.name),
|
||||
style: TextStyle(
|
||||
color: AppColors.darkNavy,
|
||||
),
|
||||
|
||||
@@ -43,7 +43,6 @@ class _DetailScreenState extends State<DetailScreen>
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final baseColor = _controller.getCardColor();
|
||||
@@ -53,111 +52,112 @@ class _DetailScreenState extends State<DetailScreen>
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
body: CustomScrollView(
|
||||
controller: _controller.scrollController,
|
||||
slivers: [
|
||||
// 상단 헤더 섹션
|
||||
SliverToBoxAdapter(
|
||||
child: DetailHeaderSection(
|
||||
subscription: widget.subscription,
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
rotateAnimation: _controller.rotateAnimation!,
|
||||
),
|
||||
),
|
||||
// 본문 콘텐츠
|
||||
SliverToBoxAdapter(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
children: [
|
||||
// 편집 모드 안내
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 12,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
baseColor.withValues(alpha: 0.15),
|
||||
baseColor.withValues(alpha: 0.08),
|
||||
],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
border: Border.all(
|
||||
color: baseColor.withValues(alpha: 0.2),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
Icons.edit_rounded,
|
||||
color: baseColor,
|
||||
size: 20,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
AppLocalizations.of(context).editMode,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: baseColor,
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
Text(
|
||||
AppLocalizations.of(context).changesAppliedAfterSave,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: AppColors.darkNavy,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 기본 정보 폼 섹션
|
||||
DetailFormSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 이벤트 가격 섹션
|
||||
DetailEventSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 웹사이트 URL 섹션
|
||||
DetailUrlSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
// 액션 버튼
|
||||
DetailActionButtons(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
],
|
||||
controller: _controller.scrollController,
|
||||
slivers: [
|
||||
// 상단 헤더 섹션
|
||||
SliverToBoxAdapter(
|
||||
child: DetailHeaderSection(
|
||||
subscription: widget.subscription,
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
rotateAnimation: _controller.rotateAnimation!,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
// 본문 콘텐츠
|
||||
SliverToBoxAdapter(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
children: [
|
||||
// 편집 모드 안내
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 12,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
baseColor.withValues(alpha: 0.15),
|
||||
baseColor.withValues(alpha: 0.08),
|
||||
],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
border: Border.all(
|
||||
color: baseColor.withValues(alpha: 0.2),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
Icons.edit_rounded,
|
||||
color: baseColor,
|
||||
size: 20,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
AppLocalizations.of(context).editMode,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: baseColor,
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
Text(
|
||||
AppLocalizations.of(context)
|
||||
.changesAppliedAfterSave,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: AppColors.darkNavy,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 기본 정보 폼 섹션
|
||||
DetailFormSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 이벤트 가격 섹션
|
||||
DetailEventSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 웹사이트 URL 섹션
|
||||
DetailUrlSection(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
// 액션 버튼
|
||||
DetailActionButtons(
|
||||
controller: _controller,
|
||||
fadeAnimation: _controller.fadeAnimation!,
|
||||
slideAnimation: _controller.slideAnimation!,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ class _MainScreenState extends State<MainScreen>
|
||||
late AnimationController _waveController;
|
||||
late ScrollController _scrollController;
|
||||
late FloatingNavBarScrollController _navBarScrollController;
|
||||
|
||||
|
||||
// 화면 목록
|
||||
late final List<Widget> _screens;
|
||||
|
||||
@@ -63,7 +63,7 @@ class _MainScreenState extends State<MainScreen>
|
||||
);
|
||||
|
||||
_scrollController = ScrollController();
|
||||
|
||||
|
||||
_navBarScrollController = FloatingNavBarScrollController(
|
||||
scrollController: _scrollController,
|
||||
onHide: () {},
|
||||
@@ -157,7 +157,7 @@ class _MainScreenState extends State<MainScreen>
|
||||
AppRoutes.addSubscription,
|
||||
).then((result) {
|
||||
_resetAnimations();
|
||||
|
||||
|
||||
// 구독이 성공적으로 추가된 경우
|
||||
if (result == true) {
|
||||
// 상단에 스낵바 표시
|
||||
@@ -203,18 +203,18 @@ class _MainScreenState extends State<MainScreen>
|
||||
|
||||
void _handleNavigation(int index, BuildContext context) {
|
||||
final navigationProvider = context.read<NavigationProvider>();
|
||||
|
||||
|
||||
// 이미 같은 인덱스면 무시
|
||||
if (navigationProvider.currentIndex == index) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 추가 버튼은 별도 처리
|
||||
if (index == 2) {
|
||||
_navigateToAddSubscription(context);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 인덱스 업데이트
|
||||
navigationProvider.updateCurrentIndex(index);
|
||||
}
|
||||
@@ -222,7 +222,7 @@ class _MainScreenState extends State<MainScreen>
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final navigationProvider = context.watch<NavigationProvider>();
|
||||
|
||||
|
||||
// 메인 그라데이션 사용
|
||||
List<Color> backgroundGradient = AppColors.mainGradient;
|
||||
|
||||
@@ -235,8 +235,12 @@ class _MainScreenState extends State<MainScreen>
|
||||
return GlassmorphicScaffold(
|
||||
body: IndexedStack(
|
||||
index: PlatformHelper.isIOS
|
||||
? (currentIndex == 3 ? 3 : currentIndex) // iOS: 설정화면은 인덱스 3
|
||||
: (currentIndex == 3 ? 3 : currentIndex == 4 ? 4 : currentIndex), // Android: 기존 로직
|
||||
? (currentIndex == 3 ? 3 : currentIndex) // iOS: 설정화면은 인덱스 3
|
||||
: (currentIndex == 3
|
||||
? 3
|
||||
: currentIndex == 4
|
||||
? 4
|
||||
: currentIndex), // Android: 기존 로직
|
||||
children: _screens,
|
||||
),
|
||||
backgroundGradient: backgroundGradient,
|
||||
@@ -249,4 +253,4 @@ class _MainScreenState extends State<MainScreen>
|
||||
enableWaveAnimation: false,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,8 @@ class _SmsScanScreenState extends State<SmsScanScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
final currentSubscription = _controller.scannedSubscriptions[_controller.currentIndex];
|
||||
final currentSubscription =
|
||||
_controller.scannedSubscriptions[_controller.currentIndex];
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
@@ -119,4 +120,4 @@ class _SmsScanScreenState extends State<SmsScanScreen> {
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user