Flutter

Flutter 깜박임 없이 서서히 페이지 이동하기

해니01_15 2024. 8. 12. 12:16

[목표]

페이지가 이동 할 때 로고가 작아지면서 다음페이지로 서서히 변하는 모습을 구현하고 싶다! 

 

[문제]

페이지를 이동할 때 새로운 페이지가 되어버리니 깜빡임이 생겼다. 

 

문제의 원인을 뽑자면 LoginPage 로 이동을 하고 로고를 서서히 줄이는 방식으로 구현 했더니 생긴것같다. 근데 다른 방법이 생각이 안나서 이건 고칠 수 없다.. 

 

[해결] 

페이지를 이동하는 함수에 FadeTransition을 사용하여 이전의 페이지는 서서히 사라지고 다음 페이지에 로고는 깜빡임 없이 서서히 사라지게 하자 

 

[코드]

  • 이미지를 줄이는 애니메이션 코드 
//다음 페이지에서 로고 이미지는 줄어들게 하기 

class AnimatedLogo extends StatefulWidget {
  @override
  _AnimatedLogoState createState() => _AnimatedLogoState();
}

class _AnimatedLogoState extends State<AnimatedLogo> {
  bool _small = false;

  @override
  void initState() {
    super.initState();
    _small = true;
  }

  @override
  Widget build(BuildContext context) {
    return TweenAnimationBuilder(
      tween: Tween<double>(begin: 120, end: _small ? 64 : 120),
      duration: Duration(seconds: 2),
      builder: (context, double size, child) {
        return SizedBox(
          width: size,
          height: size,
          child: child,
        );
      },
      child: Image.asset('assets/images/logo.png'),
    );
  }
}

 

TweenAnimationBuilder 를 이용하여 로고가 서서히 줄어들게 구현하였다. 

 

  • 기존에 그냥 페이지 이동 
//버튼 클릭시 로그인 페이지로 이동 
Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => LoginPage()),
              );

 

  • 원래의 페이지가 서서히 사라지면서 페이지 이동 
 onTap: () {
      Navigator.of(context).push(_createRoute());
            },
Route _createRoute() {
  return PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) => LoginPage(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      const begin = 0.0;
      const end = 1.0;
      const curve = Curves.ease;

      var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
      var fadeAnimation = animation.drive(tween);

      return FadeTransition(
        opacity: fadeAnimation,
        child: child,
      );
    },
  );
}

 

 

[완성본]

왼쪽이 기존 오른쪽이 수정 한 내용이다. 원래의 페이지를 서서히 사라지게 구현하니 자연스럽게 다음페이지로 이동하는 느낌이다.