import 'package:flutter/material.dart';
import 'package:toonflix/screens/detail_screen.dart';
class Webtoon extends StatelessWidget {
final String title, thumb, id;
const Webtoon({
super.key,
required this.title,
required this.thumb,
required this.id,
});
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailScreen(
title: title,
thumb: thumb,
id: id,
),
fullscreenDialog: true,
),
);
},
child: Column(
children: [
Hero(
tag: id,
child: Container(
width: 250,
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
blurRadius: 15,
offset: const Offset(10, 10),
color: Colors.black.withOpacity(0.3),
)
],
),
child: Image.network(thumb),
),
),
const SizedBox(
height: 10,
),
Text(
title,
style: const TextStyle(
fontSize: 22,
),
),
],
),
);
}
}
제공된 Flutter 코드는 웹툰을 표시하는 데 사용되는 Webtoon
위젯을 정의합니다. 이 위젯은 이미지(썸네일), 제목, 그리고 상세 화면으로의 내비게이션을 위한 상호작용을 포함하고 있습니다. 주요 구성 요소를 살펴보고, 특히 Hero
위젯에 대해 자세히 설명하겠습니다:
Webtoon
위젯Webtoon
은 상태가 시간에 따라 변경되지 않는 stateless 위젯입니다.title
, thumb
, id
세 개의 파라미터를 필요로 합니다. 이 파라미터들은 웹툰의 제목과 썸네일을 표시하고 웹툰을 고유하게 식별하는 데 사용됩니다.Column
위젯을 감싸 상호작용을 가능하게 합니다. 탭하면 DetailScreen
으로의 내비게이션이 트리거됩니다.Navigator.push
를 사용한 내비게이션GestureDetector
의 onTap
콜백이 Navigator.push
를 사용하여 DetailScreen
으로 이동합니다.MaterialPageRoute
가 전환을 위해 사용되며, fullscreenDialog: true
는 새 화면이 전체 화면 모달 다이얼로그로 나타나야 함을 나타냅니다.Flutter에서 MaterialPageRoute
는 화면 전환을 처리하는 데 사용되는 라우트의 한 종류입니다. fullscreenDialog
속성은 이 라우트가 어떻게 표시될지 결정하는 중요한 요소 중 하나입니다.
fullscreenDialog
속성fullscreenDialog
는 MaterialPageRoute
생성자에서 boolean 값으로 설정됩니다.fullscreenDialog: true
로 설정하면, 새 화면이 전체 화면 모달 다이얼로그로 나타납니다.예시:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailScreen(),
fullscreenDialog: true,
),
);
이 코드에서, fullscreenDialog: true
로 설정함으로써 DetailScreen
은 전체 화면 모달 다이얼로그로 나타나게 됩니다. 이는 사용자 경험에 있어 더 몰입감 있는 화면 전환을 제공하며, 특정 화면이 다른 일반적인 화면보다 더 중요하거나 특별한 상호작용을 필요로 할 때 유용하게 사용될 수 있습니다.
Hero
위젯Hero
위젯은 화면 간의 전환을 위해 Flutter에서 사용하는 히어로 애니메이션을 생성하는 데 사용됩니다.
Tag: 각 Hero
위젯은 고유한 태그를 가져야 합니다. 이 코드에서는 id
를 태그로 사용하여 각 웹툰이 고유한 히어로 애니메이션을 가지도록 합니다.
Child: Hero
위젯의 자식은 Image.network(thumb)
를 포함하는 Container
입니다. 이 이미지가 전환 중에 애니메이션될 부분입니다.
DetailScreen
으로 이동할 때, 동일한 태그(id
인 경우)를 가진 다른 Hero
위젯이 있다면, Flutter는 웹툰의 썸네일이 현재 화면(Webtoon
위젯)에서 DetailScreen
으로 전환되는 애니메이션을 생성합니다.
이는 썸네일이 목록 화면에서 상세 화면으로 매끄럽게 이동하고 크기가 조정되는 시각적으로 매력적인 효과를 만듭니다.
Hero
위젯의 이름은 '영웅'이라는 단어에서 유래되었습니다. 이는 두 스크린 간의 전환에서 중요한 역할을 하는 특정 요소(예: 이미지)가 마치 '영웅'처럼 주목받으며 전환되는 모습을 비유적으로 표현한 것입니다.
Hero
위젯은 Flutter에서 스크린 간 전환 시 특정 위젯을 부드럽게 '날아가게' 하는 애니메이션을 만듭니다. 두 스크린에서 동일한 Hero
태그를 가진 위젯이 서로 연결되어, 사용자가 한 화면에서 다른 화면으로 이동할 때 시각적으로 연속성을 제공합니다.
Hero
위젯을 사용하려면 다음과 같이 합니다:
Hero
위젯을 배치합니다.Hero
위젯에 동일한 tag
를 할당합니다.Hero
위젯을 탭하면, Flutter는 자동으로 목적지 스크린의 Hero
위젯으로 부드러운 전환 애니메이션을 수행합니다.Hero
위젯의 주요 매개변수는 다음과 같습니다:
Hero
위젯을 식별하는 고유한 값입니다. 두 스크린의 Hero
위젯이 연결되려면 동일한 태그를 가져야 합니다.// 원점 스크린
Hero(
tag: 'hero-tag',
child: Image.network('image-url'),
)
// 탭하면 목적지 스크린으로 이동
Navigator.push(context, MaterialPageRoute(builder: (context) => DestinationScreen()));
// 목적지 스크린
Hero(
tag: 'hero-tag',
child: Image.network('image-url'),
)
이 예시에서, 사용자가 원점 스크린의 이미지를 탭하면, Navigator.push
를 통해 목적지 스크린으로 이동하며, 동일한 hero-tag
를 가진 Hero
위젯이 목적지 스크린에서 전환 애니메이션을 수행합니다.