본문 바로가기
flutter

Flutter[플러터] / PageView 를 사용하여 스크롤 되는 페이지 구현하기 (화면 넘김, 페이징, 페이지네이션) PageView (Flutter Widget of the Week)

by ch5c 2025. 4. 28.
반응형

PageView class

페이지별로 작동하는 스크롤 가능한 목록입니다.

 

페이지 뷰의 각 자식은 뷰포트와 동일한 크기가 되도록 강제됩니다.

PageController를 사용하여 뷰에 표시되는 페이지를 제어할 수 있습니다. PageController 는 PageView 내부 콘텐츠의 픽셀 오프셋을 제어할 수 있을 뿐만 아니라 , 뷰포트 크기의 증분인 페이지 단위로 오프셋을 제어할 수도 있습니다.

PageController PageView 처음 생성될 때 어떤 페이지가 표시되는지 결정하는 PageController.initialPage  뷰포트 크기에 대한 분수로 페이지 크기를 결정하는 PageController.viewportFraction 을 제어하는 ​​데에도 사용할 수 있습니다.

https://youtu.be/J1gE9xvph-A

공식 문서 코드

 

 


PageView 가 무엇인가 하면 가장 쉽게 설명할 수 있는 것은 인스타그램의 포스트이다.

옆으로 스와이프 하면 자동 정렬이 되며 다음 사진으로 넘어가게 된다. PageView 는 그 작업을 간단하게 수행해 주는 위젯이다.

 

위의 다트 패드 예제로 사용해 보면 좋을 것인데 많은 사람들이 모르는 것 같아 팁을 주자면 가로 스크롤은 (Shift + 마우스 휠) 로 스크롤이 가능하다. 암튼 이렇게 스크롤해 보면 스크롤한 것이 리스트처럼 넘어가지 않고 자동정렬로 맞춰지는 것을 알 수가 있다.

 

한번 간단하게 알아보자.

하위 속성
속성명 타입 기본값 설명
allowImplicitScrolling bool false 스크롤 시 접근성 이동을 허용할지 여부를 설정
restorationId String? 스크롤 위치 복원을 위한 ID
scrollDirection Axis Axis.horizontal 스크롤 방향을 설정
reverse bool false 스크롤 방향을 반전할지 여부를 설정
controller PageController? 스크롤 위치를 제어하는 컨트롤러
physics ScrollPhysics? 사용자 입력에 대한 스크롤 반응 방식을 설정
pageSnapping bool true 페이지가 스냅되도록 할지 여부를 설정
onPageChanged ValueChanged<int>? 페이지 변경 시 호출되는 콜백 함수
childrenDelegate SliverChildDelegate 자식 위젯을 제공하는 위임 객체
dragStartBehavior DragStartBehavior DragStartBehavior.start 드래그 시작 시 동작 방식을 설정
clipBehavior Clip Clip.hardEdge 페이지를 클립할 때 사용하는 방법을 설정
hitTestBehavior HitTestBehavior HitTestBehavior.opaque 히트 테스트 시의 동작 방식을 설정
scrollBehavior ScrollBehavior? 스크롤 동작에 대한 커스텀 설정
padEnds bool true 양 끝에 패딩을 추가할지 여부를 설정

 

음 일단 다른 거 다 볼 필요 없고 먼저 스크롤되는 위젯이다? 일단 무조건 controller 부터 넣어주면 되겠다.

ScrollController scrollController = ScrollController();

 

이 ScrollController 값으로 PageView 를 제어할 수 있다.

 

그리고 당연하게도 스크롤되는 위젯들의 종특인 사이즈를 지정해줘야 한다.사용할 때 꼭!! SizedBox 로 감싸서 제작하거나 크기를 줄 수 있는 위젯으로 감싼 후 제작하자!

SizedBox(
  height: 150,
  width: 450,
  child: PageView(

 

이번엔 굉장히 많이 사용되는 친구를 소개할 것인데 바로 한 화면에 두 개 이상 표시가 되겠다.

아마 이대로 사용하면 위의 예제처럼 한 화면을 한 PageView 가 차지하고 있는 모습을 볼 수가 있는데 우리가 개발할 때 한 화면에 여러 개의 아이템이 있어야 하는 경우도 분명 있을 것이다.

 

그럴 때에 사용할 것이 바로 ScrollController 안에 있는 viewportFraction 값인데 이 값은 double을 인자로 받는 친구다.

그럼 여기다가 무엇을 넣어주냐? 1 / n 의 값을 넣어주면 된다. 여기서 n 은 자신이 표시하고자 하는 아이템 수인데, 예를 들어 내가 아이템 3개를 표시하고 싶다. 그렇다면 1 / 3, 즉 0.33 을 넣어주면 된다.

PageController pageController = PageController(viewportFraction: 0.33);

 

이러면 컨트롤러를 연결해 놓은 PageView 에서 이제 아이템 3개가 표시가 될 텐데 

 

아마 앞의 한 칸이 띄어져 있을 것이다.

여기서 이제 PageView 의 하위 속성인 padEnds 를 false 로 설정해 주면 양옆 패딩이 사라지게 된다.

 

페이지뷰는 리스트와 다르게 위의 예제와 같이 현재 보고 있는 인덱스라는 것이 존재하기 때문에 비교적 쉽게 페이징 기능도 구현을 할 수가 있다. 그것은 위의 공식 예제 코드를 참고하도록 하자.

 

이렇게 이번엔 PageView 를 알아보았다. 이 친구는 내가 보통 .builder 를 붙여서 많이 사용하는데 굉장히 오랫동안 많이 볼 녀석 같으니 미리미리 공부를 해둬야 추후에 좋을 것 같다. 그렇다면 도움이 되었길 바라며 이만 마치겠다.

반응형
반응형