- @doc/color.md 가이드라인에 따른 색상 시스템 전면 개편 - 딥 블루(#2563EB), 스카이 블루(#60A5FA) 메인 컬러로 변경 - 모든 화면과 위젯에 글래스모피즘 효과 일관성 있게 적용 - darkNavy, navyGray 등 새로운 텍스트 색상 체계 도입 - 공통 스낵바 및 다이얼로그 컴포넌트 추가 - Claude AI 프로젝트 컨텍스트 파일(CLAUDE.md) 추가 영향받은 컴포넌트: - 10개 스크린 (main, settings, detail, splash 등) - 30개 이상 위젯 (buttons, cards, forms 등) - 테마 시스템 (AppColors, AppTheme) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
147 lines
4.9 KiB
Dart
147 lines
4.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../models/subscription_model.dart';
|
|
import '../controllers/detail_screen_controller.dart';
|
|
import '../widgets/detail/detail_header_section.dart';
|
|
import '../widgets/detail/detail_form_section.dart';
|
|
import '../widgets/detail/detail_event_section.dart';
|
|
import '../widgets/detail/detail_url_section.dart';
|
|
import '../widgets/detail/detail_action_buttons.dart';
|
|
import '../theme/app_colors.dart';
|
|
|
|
/// 구독 상세 정보를 표시하고 편집할 수 있는 화면
|
|
class DetailScreen extends StatefulWidget {
|
|
final SubscriptionModel subscription;
|
|
|
|
const DetailScreen({
|
|
super.key,
|
|
required this.subscription,
|
|
});
|
|
|
|
@override
|
|
State<DetailScreen> createState() => _DetailScreenState();
|
|
}
|
|
|
|
class _DetailScreenState extends State<DetailScreen>
|
|
with SingleTickerProviderStateMixin {
|
|
late DetailScreenController _controller;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_controller = DetailScreenController(
|
|
context: context,
|
|
subscription: widget.subscription,
|
|
);
|
|
_controller.initialize(vsync: this);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_controller.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final baseColor = _controller.getCardColor();
|
|
|
|
return 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(
|
|
color: baseColor.withValues(alpha: 0.1),
|
|
borderRadius: BorderRadius.circular(16),
|
|
),
|
|
child: Row(
|
|
children: [
|
|
Icon(
|
|
Icons.edit_rounded,
|
|
color: baseColor,
|
|
size: 20,
|
|
),
|
|
const SizedBox(width: 8),
|
|
Text(
|
|
'편집 모드',
|
|
style: TextStyle(
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.w600,
|
|
color: baseColor,
|
|
),
|
|
),
|
|
const Spacer(),
|
|
Text(
|
|
'변경사항은 저장 후 적용됩니다',
|
|
style: TextStyle(
|
|
fontSize: 14,
|
|
color: baseColor.withValues(alpha: 0.8),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
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!,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
} |