[movie_app] home_page 'carousel_slider'
Flutter SDK releases
All current Flutter SDK releases, stable, beta, and master.
docs.flutter.dev
플러터 업그레이드를 해볼까 하고 최신 sdk 를 다운 받았다. 압축 풀고 vscode 에 path 경로를 넣어주자
설정 들어가서 flutter sdk 검색하고 Flutter Sdk Paths 에 한 줄 더 적어주면 된다. 폴더명이 동일해서 기존에 있던 경로 복사해서 3.3.10으로 바꿔주었다.
내가 만들 앱을 위해 main.dart 를 정리하고 home.dart 를 만들어 메인 홈 페이지를 제작한다.
carousel_slider | Flutter Package
A carousel slider widget, support infinite scroll and custom child widget.
pub.dev
영화 포스터 이미지들을 상단에 배너처럼 움직이게 하기위해 패키지를 하나 설치한다.
이 pub.dev 페이지에서 내가 필요한 패키지들을 검색하면 된다. 재밌는 것도 설치해서 가지고 놀고 하면 재밌다.
설치방법은 친절하게 다 적혀있다. 그저 flutter pub add ~ 만 하면 된다.
이미지를 사용하기 위해 assets 폴더를 지정해주고 다운받은 이미지를 넣어준다.
이미지는 PixaBay 에서 받았다.
참고로 이미지 폴더를 활성화 하려면 pubspec.yaml 에서 주석을 해제하고 사용해야 한다.
필요한 이미지경로만 넣어줘도 되지만 images 폴더 내의 모든 이미지 파일들을 사용하려고 폴더 경로를 적어주었다.
이미지 위젯 리스트를 만든 다음 indicator 를 나타내기 위해 index 를 선언한다.
다음 Stack 을 이용해 indicator 로 이용할 아이콘을 배치한 후 이미지 인덱스가 변할 때 마다 setState() 로 index를 변경해주며 일치하는 인덱스의 아이콘 일 때 컬러를 변경해주며 나타낸다.
import 'dart:developer';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int indicatorIndex = 0;
@override
void initState() {
log("message2");
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
log("message1");
List<Widget> imagePaths = [
SizedBox(width: MediaQuery.of(context).size.width, child: Image.asset("assets/images/img1.jpg", fit: BoxFit.fitWidth)),
SizedBox(width: MediaQuery.of(context).size.width, child: Image.asset("assets/images/img2.jpg", fit: BoxFit.fitWidth)),
SizedBox(width: MediaQuery.of(context).size.width, child: Image.asset("assets/images/img3.jpg", fit: BoxFit.fitWidth)),
];
return Scaffold(
appBar: AppBar(
title: Text("Home"),
),
body: Column(
children: [
Stack(
children: [
CarouselSlider(
options: CarouselOptions(
autoPlay: true,
enlargeCenterPage: false, // 사라지는 이미지 효과
scrollDirection: Axis.horizontal,
viewportFraction: 1.0, // 화면 채우기
onPageChanged: (index, reason) {
log(indicatorIndex.toString());
setState(() {
indicatorIndex = index;
});
},
),
items: imagePaths
),
Positioned(
bottom: 10,
right: 0,
left: 0,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
for (int i=0; i<imagePaths.length; i++)
Icon(Icons.circle, color: indicatorIndex == i ? Colors.black : Colors.white)
],
)
),
],
),
],
),
);
}
}
** setState()
StatelessWidget 와 StatefulWidget 위젯이 있다.
StatelessWidget 는 말 그대로 정적이다. 변화가 없고 사용자의 동작에 맞춰 갱신해야 할 위젯이 없을 때 사용된다.
StatefulWidget 은 사용자가 버튼을 클릭 했을 때, 시간이 흐르면서 위젯이 갱신되어야 할 때 등 위젯이 변경될 때 사용된다.
StatefulWidget 에는 setState() 라는 메소드가 있는데 이를 통해서 버튼 등을 클릭 하였을 때 변경해야하는 값을 전달하고 해당 위젯을 다시 빌드 한다.
앱이 그렇듯 플러터도 생명주기가 있다. StatelessWidget 와 StatefulWidget은 서로 다르다.
** constructor
생성자. 필요한 변수 등을 가져와 준다.
** createState()
state 생성. 실행 하게 한다. 필수다.
** initState()
단 한번 초기화 해야 하는 데이터가 있을 때 사용한다. 재빌드 되도 변화가 없는 메소드이다.
** didChangeDependencies()
데이터에 의존하는 위젯일 경우 화면에 표시하기 전에 호출해야한다고 하는데 한번도 사용해본 적이 없다..
여기저기 찾아보니 api 호출이 필요할 때 사용한다고 한다. 이번에 사용해봐야겠다.
** build()
이 메소드는 항상. 자주 호출된다. 핫 리로드, setState() 등 UI를 다시 그릴 때 항상 호출된다.
이곳이 무겁다면 앱의 성능이 낮아 질 것이다..
위젯을 필수로 리턴해야한다.
** setState()
앞에서 기술했듯 사용자의 상호작용으로부터 등 UI 에 변화를 주어야하는 데이터라면 이 메소드를 호출하여 프레임워크에 알려야한다.
build() 메소드가 호출된다.
** didUpdateWidget()
한번도 사용해보지 않았지만.. 부모 위젯이 변경되었을 때 갱신이 필요한 경우 사용된다고 한다.
** dispose()
controller 등 선언하고 사용하였던 것들이 더 이상 필요없을 때 이 메소드에서 제거해준다. 메모리 관리를 위해서 dispose 해주자.