flutter로 위젯 애니메이션 앱 만들어보기

오늘은 flutter로 같은 위젯을 애니메이션하는 앱을 만들어보려합니다.

이 포스팅을 따라 오신다면 여러분도 화면 이동할 때의 위젯 애니메이션을 가진 안드로이드, ios 앱을 동시에 만들어 볼 수 있습니다.

에뮬레이터 및 기기 준비하기

안드로이드나 ios 앱을 구동할 장치를 준비해야 합니다.

준비했으면, 미리 기기를 ide에 연결해줍니다.

이미지 파일 준비하기

https://raw.githubusercontent.com/flutter/website/master/src/_includes/code/layout/lakes/images/lake.jpg

앱에 사용될 이미지를 준비해줍니다.

이 이미지는 flutter 튜토리얼 사이트의 Building Layouts에 포함된 이미지로서 BSD License가 적용됩니다.

code samples are licensed under the BSD License.

pubspec.yaml 작성하기

우선 노드js의 npm처럼 패키지 매니저를 사용할 수 있습니다.

패키지의 이름이나 버전 그리고 의존성 패키지들을 관리할 수 있습니다.

https://pub.dartlang.org 에서 패키지를 조회하고 내려받을 수 있습니다.

flutter:
  uses-material-design: true
  assets:
    - lake.jpg

기본적으로 새로운 프로젝트를 생성하면 이미지를 에셋에 등록하기 위해 위와 같이 등록시켜줍니다.

main.dart 작성하기

이제 메인 코드를 작성해보아야 합니다.

import 'package:flutter/material.dart';

flutter/material 패키지를 사용하겠다는 것이지만, 대부분의 앱에서 반드시 가져와야 하는 필수 패키지입니다.

void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Transition',
      home: MainScreen(),
    );
  }
}

처음 앱이 실행될 때 앱의 타이틀과 메인스크린 위젯을 출력합니다.

class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        child: Hero(
          tag: '같은태그',
          child: Image.asset(
            'lake.jpg',
            fit: BoxFit.cover,
          ),
        ),

이미지 에셋으로 받아온 이미지를 Hero로 감싸서 태그를 지정합니다.

이 태그로 인해 같은 태그끼리 화면이 넘어갈 때 애니메이션을 형성할 수 있습니다.

만약 다음 페이지에 존재하는 Hero에서 태그가 다르다면 일반적인 화면 전환처럼 이루어집니다.

        onTap: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => DetailScreen()),
          );
        },
      ),
    );
  }
}

이미지를 감싼 Hero를 GestureDetector로 또 감싸서 onTap 속성을 사용할 수 있게 합니다.

GestureDetector를 이용했기 때문에, The named parameter ‘onTap’ isn’t defined.라는며 인자가 없다는 오류가 출력되지 않습니다.

이미지를 누르면 DetailScreen로 넘어갑니다.

class DetailScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Hero(
          tag: '같은태그',
          child: Image.asset(
            'lake.jpg',
            fit: BoxFit.cover,
          ),
        ),
      ),
    );
  }
}

이미지를 누르면 DetailScreen 위젯이 출력되면서 뒤로가기가 들어간 앱 바와 이미지가 화면에 그려지게 됩니다.

이 이미지는 GestureDetector가 없기 때문에 이미지를 눌러도 반응이 없습니다.

이제 앱을 빌드하고 이미지를 눌러보면 위젯 애니메이션이 작동하는 것을 볼 수 있습니다.

Written on December 24, 2018