728x90
목표
Carousel slide의 구조와 실 사용법을 확인하여 보고 실제 코드까지 작성을 해본다
정의
해당 플러그인은 이미지를 루프처럼 넘기거나 자동으로 움직일 수 있는 플러그인을 말한다.
사용 예시
코드를 직접보면서 순번을 따라 만들어 보자.
먼저 pubspec.yaml 파일에서 아래의 두개 플러그인을 설치한다.
carousel_slider는 슬라이더를 위한 것이며, smooth_page_indicator는 추후에 사용할 dot indicator를 적용하기 위함이다.
# image carousel slider
carousel_slider: ^4.2.1
# dots indicator
smooth_page_indicator: ^0.3.0-nullsafety.0
그다음 main.dart에서 다음의 코드를 통해 구현을 한다. 사진은 unsplash에서 제공하는 어떤것을 사용해도 좋다.
import 'package:flutter/material.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
///1. pubspec.yaml 파일에서 carousel_slider와 smooth indicator를 입력하여 사용가능하게 만든다.
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'carousel slider',
theme: ThemeData(primarySwatch: Colors.purple),
home: Myhome(),
);
}
}
class Myhome extends StatefulWidget {
const Myhome({super.key});
@override
State<Myhome> createState() => _MyhomeState();
}
class _MyhomeState extends State<Myhome> {
/// 5-1. activeIndex의 기초값을 선언한다
int activeIndex = 0;
/// 2. List로 홈페이지 상에서 Url를 가져 올 수 있도록 주소들을 입력한다.
final List<String> imageUrls = [
'https://images.unsplash.com/photo-1633989464081-16ccd31287a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxoZWxsb3xlbnwwfHx8fDE2NTk0MDQ5NTQ&ixlib=rb-1.2.1&q=80&w=2000',
'https://images.unsplash.com/photo-1633989464081-16ccd31287a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxoZWxsb3xlbnwwfHx8fDE2NTk0MDQ5NTQ&ixlib=rb-1.2.1&q=80&w=2000',
'https://images.unsplash.com/photo-1633989464081-16ccd31287a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxoZWxsb3xlbnwwfHx8fDE2NTk0MDQ5NTQ&ixlib=rb-1.2.1&q=80&w=2000',
'https://images.unsplash.com/photo-1633989464081-16ccd31287a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxoZWxsb3xlbnwwfHx8fDE2NTk0MDQ5NTQ&ixlib=rb-1.2.1&q=80&w=2000',
'https://images.unsplash.com/photo-1633989464081-16ccd31287a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxoZWxsb3xlbnwwfHx8fDE2NTk0MDQ5NTQ&ixlib=rb-1.2.1&q=80&w=2000',
];
/// 3. Carousel slider가 원하는 형태의 UI로 사진을 보여줄 수 있도록 형태를 만든다.
/// horizontal은 사진간의 거리를 의미하며
/// color의 경우에는 사진이 차지할 공간의 임시적인 색을 의미한다.
/// Image.network 위젯을 사용하여 imageUrl(미리 List에서 선언해두었다)를 불러온다
Widget buildImage(String imageUrl, int index) => Container(
margin: EdgeInsets.symmetric(horizontal: 12),
color: Colors.grey,
child: Image.network(
imageUrl,
fit: BoxFit.cover,
),
);
/// 5-3. buildIndicator의 속성을 위젯으로 만들어준다.
Widget buildIndicator() => AnimatedSmoothIndicator(
activeIndex: activeIndex,
count: imageUrls.length,
/// effect는 여러가지가 있으니 홈페이지에서 참고하여 확인하길 바란다.
effect: JumpingDotEffect(dotWidth: 20, dotHeight: 20),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Carousel Slider"),
elevation: 0,
),
/// 4. CarouselSlider를 사용하게 되면 itemCount, itemBuilder, option 이렇게 총 3가지
/// 가 required가 되는데, 각각은 다음과 같은 역할을 한다
/// itemCount: 보여주고자 하는 이미지의 갯수
/// itemBuilder: 이미지의 갯수등을 입력받고 buildImage 위젯을 반환한다
/// options: Carousel이 autoplay, height, enlargeCenterPage 등 다양한 형태의
/// 추가 옵션을 넣어 꾸밀 수 있다.
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CarouselSlider.builder(
itemCount: imageUrls.length,
itemBuilder: (context, index, realIndex) {
final imageUrl = imageUrls[index];
return buildImage(imageUrl, index);
},
options: CarouselOptions(
autoPlay: true,
height: 400,
enlargeCenterPage: true,
/// 5. dot을 넣어 indicator를 만든다
onPageChanged: (index, reason) =>
setState(() => activeIndex = index),
),
),
/// 5-2. Indicator를 추가 하기 위한 공간을 확보한다.
SizedBox(height: 20),
buildIndicator(),
],
),
),
);
}
}
실제 화면은 다음과 같다
참고: HeyFlutter, Flutter Tutorial - Build A Simple Image Slider Carousel | Flutter Carousel Slider (https://youtu.be/JEMx2ax0734)
728x90
'Flutter' 카테고리의 다른 글
7-1. Debounce 실습 (0) | 2023.04.03 |
---|---|
[Practice] shared preference (0) | 2023.04.02 |
[플러그인] 사용하기 좋은 플러그인 7가지 소개 (0) | 2023.03.30 |
[Practice] TodoList만들기 (0) | 2023.03.29 |
5-1. Riverpod 실습 (Counter App) (0) | 2023.03.28 |