본문 바로가기

소프트웨어 /Flutter

[Flutter] pageview 사용하기

반응형

 

 

PageView class - widgets library - Dart API

A scrollable list that works page by page. Each child of a page view is forced to be the same size as the viewport. You can use a PageController to control which page is visible in the view. In addition to being able to control the pixel offset of the cont

api.flutter.dev

 

PageView란 페이지별로 스크롤이 가능한 위젯이다.

 

지난번에 만들어 둔 ListView에 PageView를 추가해보도록 하자.

 

먼저 결과물은 아래와 같다. PageView가 앱바 아래에 위치하고 해당 PageView는 horizontal로 스크롤이 가능하며 스크롤 시 이미지가 변경되는 것을 확인할 수 있다.

 

 

지난번에 리스트를 만든 걸 활용하였는데 StatelessWidget으로 홈화면을 만들어 주고 그 안에 PageView와 ListView를 넣어주었다.

 

home.dart

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    List<String> mainList = [
      'Cold',
      'Poll',
      'Beam',
      'Greek',
      'Song',
      'Tight',
      'Run',
      'Count'
    ];

    final PageController pageController = PageController(initialPage: 0);

    return Scaffold(
        appBar: AppBar(
          title: Text('TEST'),
        ),
        body: Column(
          children: [
            Container(
              height: 100,
              child: PageView(
                  scrollDirection: Axis.horizontal,
                  controller: pageController,
                  children: [
                    Image.asset('assets/images/a.jpg'),
                    Image.asset('assets/images/b.jpg'),
                    Image.asset('assets/images/c.jpg'),
                  ],
                ),
              ),
            Expanded(
              child: ListView.separated(
                itemCount: mainList.length,
                itemBuilder: (BuildContext context, int index) {
                  return ListTile(
                    onTap: () {},
                    title: Container(
                      alignment: Alignment.centerLeft,
                      height: 50,
                      child: Text(
                        mainList[index],
                        textAlign: TextAlign.start,
                      ),
                    ),
                  );
                }, separatorBuilder: (BuildContext context, int index) { return Divider(thickness: 1); },),
            )
          ],
        )
    );
  }
}

 

main.dart

import 'package:flutter/material.dart';
import 'package:test_20210719/home.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

 

중간에 Expanded를 넣은 이유는 처음엔 Expanded 대신 상위에 Column만 사용하려고 하였으나 리스트가 나오지 않는 오류가 발생했고 해당 오류는 RenderBox was not laid out 이라는 오류로 리스트뷰 열 내부에 배치가 되어서 발생하는 오류라고 한다. 그래서 Expanded를 사용을 추천한다.

 

앱바 아래에 배너처럼 사용하기 위해서 Container로 감싼 후 height 값을 따로 주었다.

그리고 PageView를 이용해 스크롤 방향과 controller를 세팅해 주었다.