flutter로 이미지 가져오면서 placeholder 설정하기

오늘은 flutter의 외부 패키지인 cached_network_image로 placeholder를 설정하고, 이미지를 가져와서 출력하는 앱을 만들어보려 합니다.

원래 cached_network_image 패키지는 이름처럼 이미지를 캐싱해주는 기능이 주를 이루고 있으나, placeholder를 위젯으로 사용하거나 페이드 인아웃 효과도 별도로 부여할 수 있기 때문에 이 패키지를 사용했습니다.

(간단하게 페이드 인 효과를 주고 싶다면 flutter에는 기본적으로 FadeInImage이라는 패키지가 존재하긴 합니다.)

이 포스팅을 따라 오신다면 여러분도 특정 이미지를 인터넷에서 가져와서 출력할 때 사용자 경험을 좋게 만들어놓은 앱을 안드로이드, ios 앱으로 동시에 만들어 볼 수 있습니다.

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

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

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

pubspec.yaml 작성하기

외부 패키지인 cached_network_image를 사용하기 위해서는 pubspec 파일에서 의존성을 추가해야 합니다.

dependencies:
  flutter:
    sdk: flutter
  cached_network_image:

pubspec 파일을 작성한 뒤에는 터미널에서 아래와 같이 적용해주어야 합니다.

$ flutter packages get

main.dart 작성하기

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

import 'package:flutter/material.dart';

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

import 'package:cached_network_image/cached_network_image.dart';

pubspec의 dependencies에 정의한 cached_network_image를 가져옵니다.

void main() {
  runApp(MaterialApp(
    title: 'Image loading', 
    home: Scaffold(body: MyApp())));
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment.center,

Container 위젯으로 정렬을 정의해줍니다.

      child: CachedNetworkImage(
        placeholder: CircularProgressIndicator(),

Container 위젯의 하위에는 CachedNetworkImage 위젯으로 이미지를 기기에 캐싱할 수 있게 합니다.

이 위젯으로 인하여 기존에 미리 구현되어 있는 CircularProgressIndicator 위젯을 placeholder로 사용할 수 있습니다.

        imageUrl:
            'https://github.com/flutter/plugins/raw/master/packages/video_player/doc/demo_ipod.gif?raw=true',

imageUrl 속성으로 가져올 이미지 주소를 삽입합니다.

앞 포스팅에서 언급한 것처럼 gif 파일도 가능합니다.

        errorWidget: Icon(Icons.error),

오류가 났을 때를 대비한 아이콘 위젯 출력도 가능합니다.

        fadeInCurve: Curves.easeIn,
        fadeInDuration: Duration(seconds: 3),
      ),
    );
  }
}

flutter에 기본으로 들어있는 FadeInImage 패키지처럼 FadeIn 효과를 줄 수 있고, 추가로 효과를 주는 주기도 설정할 수 있습니다.

위 코드대로 작성하면 3초간 FadeIn 됩니다.

코드를 빌드한 뒤에 연속으로 앱을 구동하면 이미지를 불러오는 시간이 단축됨을 확인할 수 있습니다.

Written on January 19, 2019