[Flutter] 모바일 앱 개발 : Flutter 시작하기 #4 - First Flutter App (3)

in #dclick7 years ago (edited)

안녕하세요. @anpigon 입니다.

이전 글 "모바일 앱 개발 : Flutter 시작하기 #3"에서 이어집니다. Flutter 튜토리얼 파트2의 1~5번까지의 과정을 따라하면서 학습하였습니다. 이번에는 하트 아이콘을 추가하고 단어를 즐겨찾기에 추가/제거하는 기능을 구현합니다.

Screenshot 1.png

이번에 구현한 완성된 앱의 동작 화면입니다.

Oct202018 002152.gif




목록에 하트 아이콘 추가하기


목록의 각 행에 하트 아이콘을 추가한다. 그리고 하트 아이콘을 누르면 즐겨찾기에 저장한다.

RandomWordsState 클래스에 _saved Set을 추가한다. _saved 에는 사용자가 선택한 단어를 저장할 것이다. 참고로 Set에는 중복된 값이 허용되지 않는다.

class RandomWordsState extends State<RandomWords> {
  final List<WordPair> _suggestions = <WordPair>[];
  final Set<WordPair> _saved = new Set<WordPair>(); // 추가된 코드
  final TextStyle _biggerFont = const TextStyle(fontSize: 18.0);
  ...
}


_buildRow() 함수에 alreadySaved 변수를 추가한다. alreadySaved는 해당 단어가 즐겨찾기에 추가되어 있는지 여부를 확인한다.

Widget _buildRow(WordPair pair) {
  final bool alreadySaved = _saved.contains(pair); // 추가된 코드
  ...
}


이제 ListTile 객체에 하트 아이콘을 추가하여 즐겨찾기 기능을 구현해보자. 하트 아이콘은 ListTile의 trailing 속성을 사용하여 추가한다. trailing 속성은 일반적으로 제목 뒤에 아이콘 위젯을 표시 할때 사용된다. RandomWordsState 클래스의 _buildRow() 함수를 아래와 같이 수정한다.

Widget _buildRow(WordPair pair) {
  final bool alreadySaved = _saved.contains(pair);
  return new ListTile(
    title: new Text(
      pair.asPascalCase,
      style: _biggerFont,
    ),
    trailing: new Icon(   // 여기서부터 추가된 코드 ... 
      alreadySaved ? Icons.favorite : Icons.favorite_border,
      color: alreadySaved ? Colors.red : null,
    ),                    // ... 여기까지
  );
}


안드로이드 스튜디오는 왼쪽 패널에서 아이콘 모양과 색상을 바로 확인할 수 있다.
스크린샷 20181019 23.58.18.png


이제 앱을 새로고침하면 목록에 하트 아이콘이 보인다.

아이폰안드로이드
스크린샷 20181020 00.13.27.png스크린샷 20181019 23.34.05.png




즐겨찾기에 단어 저장하기


이번에는 목록에서 단어를 선택하면 즐겨찾기에 추가되도록 구현해보자. 이미 단어가 즐겨찾기에 추가된 경우에는 즐겨찾기에서 제거되도록 한다. 그리고 state가 변경되었음을 프레임워크에 알려주기 위해 setState() 함수를 호출하였다. 참고로 setState() 함수를 호출하면 State 객체의 build() 함수 호출이 트리거되어 UI가 업데이트된다.

아래와 같이 _buildRow 함수에 onTap 속성을 추가한다.

Widget _buildRow(WordPair pair) {
  final alreadySaved = _saved.contains(pair);
  return new ListTile(
    title: new Text(
      pair.asPascalCase,
      style: _biggerFont,
    ),
    trailing: new Icon(
      alreadySaved ? Icons.favorite : Icons.favorite_border,
      color: alreadySaved ? Colors.red : null,
    ),
    onTap: () {      // 여기서부터 추가된 코드 ...
      setState(() {
        if (alreadySaved) {
          _saved.remove(pair);
        } else { 
          _saved.add(pair); 
        } 
      });
    },               // ... 여기까지
  );
} 


앱을 새로고침한다. 이제 원하는 단어를 선택하면 즐겨찾기에 추가 할 수 있다.

아이폰안드로이드
스크린샷 20181020 00.16.35.png스크린샷 20181020 00.10.46.png


만약 앱이 제대로 작동하지 않는다면 lib/main.dart 코드를 참고하세요.

여기까지 읽어주셔서 감사합니다.

이전 글


Sponsored ( Powered by dclick )
[트립스팀]할로윈을 즐기고 싶다면 에버랜드로!!(10/14-15)

![image]( 안녕하세요 달콤한 아빠 입니다 저희 가족은 지난 월요일 에버랜드라는 정말 좋...

logo

이 글은 스팀 기반 광고 플랫폼
dclick 에 의해 작성 되었습니다.

Sort:  

@anpigon님 곰돌이 자다 깨서 보팅 왔어요. 그럼 전 다시 꿈나라로~ @gomdory 곰도뤼~

자는 동안에 곰돌이가 왔다 갔구나. 보팅 받고 가야지~ ㅋ

따라해보고 싶어요 어렵지 않을까요? 쌩초보 입문인데...🤧

쌩초보도 저만 따라하면 코딩 고수가 될 수 있습니다.👍

우어어어어어
내일은 캠핑가니까... 다음주 부터 따라 시작해야 겠습니다 ㅋㅋㅋㅋ

캠핑 잘 다녀오세요~ㅎㅎㅎ 다음주에는 kr-dev에도 [꾸준함이 답이다] 시리즈 올라오나요?

내일 대만 가는데 다녀오면 한번 쭈욱 따라해보고 싶네요~

대만 잘다녀오세요. 그리고 플러터 같이 공부해요~ㅋ

blockchainstudio님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
blockchainstudio님의 곰돌이 스파임대 회수를 부탁드립니다.

...그때 외면하지 말아주세요ㅠㅠ
현금임대해주셨던 분들 역시 최대한 빨리 제 계정의 수익으로 갚도록 하겠습니다. anpigon(20스달), bluengel (9.94스팀), mooring (5스팀), urobotics (1.128스달)...

Hi @anpigon!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 2.450 which ranks you at #16851 across all Steem accounts.
Your rank has improved 37 places in the last three days (old rank 16888).

In our last Algorithmic Curation Round, consisting of 236 contributions, your post is ranked at #198.

Evaluation of your UA score:
  • Only a few people are following you, try to convince more people with good work.
  • The readers like your work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server

Coin Marketplace

STEEM 0.12
TRX 0.34
JST 0.033
BTC 122047.57
ETH 4486.09
SBD 0.77