프로그래밍/플러터

PageView와 Timer

스루나루 2024. 2. 24. 15:56
728x90
728x90

 

코드 설명 

 

 1) Timer 

 - 특정 시간 지난 후 일회성 혹은 지속적으로 함수를 실행 

 - periodic() : 주기적으로 콜백 함수를 실행한다. 

 - 보통 initState()에 두어서 초기화를 두고 실행시킨 다음 dispose()에 타이머를 종료하여 누수를 막는다. 

 

 //앱이 최초 랜더링 될 때 단 한 번만 실행
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    // 상태바 색상 변경
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);

    //타이머를 세팅해서 주기적으로 실행되도록 설정
    //build에 넣어두면 새로 만들 때마다 새롭게 빌드되어버려서 initState에 정의
    Timer.periodic(const Duration(seconds: 3), (timer) {
      // 다음 페이지가 무엇인지 컨트롤러에서 페이지를 찾는다
      int? nextPage = pageController.page?.toInt();

      if (nextPage == null) {
        return;
      }

      if (nextPage == 4) {
        nextPage = 0;
      } else {
        nextPage++;
      }

      pageController.animateToPage(
        nextPage,
        duration: const Duration(milliseconds: 500),
        curve: Curves.ease,
      );
    });
  }

 

 2) PageView 

 - material 패키지에서 기본으로 제공 

 - 하위 위젯들을 드래그 하면 하나하나씩 보여준다. 

 - 컨트롤러를 통해서 PageView위젯을 제어할 수 있다. 이 또한 하나의 상태인듯 

 - build쪽이 아니라 State쪽에다가 선언해줌 

class _HomeScreenState extends State<HomeScreen> {
  //PageView를 제어할 컨트롤러 생성
  final PageController pageController = PageController();

 

 PageView(
          controller: pageController,
          children: [1, 2, 3, 4, 5]
              .map(
                (num) => Image.asset(
                  'asset/img/$num.png',
                  //fit: BoxFit.cover,
                  fit: BoxFit.fitWidth
                ),
              )
          // children은 위젯 리스트로 전해줘야한다.
              .toList(),
        ),

 

결과물

 

 

 

 

참고

《Must Have 코드팩토리의 플러터 프로그래밍 2판》의 스터디 내용 입니다.

728x90
728x90