- flutter

kakao앱 만들기 (2) - 친구 목록 화면

나둥식 2022. 11. 11. 12:28

✅ 친구 목록 화면 만들기

 

1️⃣ User 샘플 데이터 만들기

class User {
  final String backgroundImage;
  final String name;
  final String intro;

  User(
      {required this.backgroundImage, required this.name, required this.intro});
}

final String _urlPrefix =
    "http://raw.githubusercontent.com/flutter-coder/ui_images/master/messenger";

User me = User(
  backgroundImage: "${_urlPrefix}_me.jpg",
  name: "김철수",
  intro: "고통없이는 얻는 것도 없다",
);

List<User> friends = [
  User(
    backgroundImage: "${_urlPrefix}_man_1.jpg",
    name: "홍길동",
    intro: "아버지라 불러도 되겠습니까",
  ),
  User(
    backgroundImage: "${_urlPrefix}_woman_1.jpg",
    name: "정도전",
    intro: "앞이 보이겠습니까",
  ),
  User(
    backgroundImage: "${_urlPrefix}_man_2.jpg",
    name: "박태수",
    intro: "지금 어디에 와 있을까",
  ),
  User(
    backgroundImage: "${_urlPrefix}_woman_2.jpg",
    name: "김상중",
    intro: "그런데 말입니다.",
  ),
  User(
    backgroundImage: "${_urlPrefix}_man_3.jpg",
    name: "김두한",
    intro: "4딸라",
  ),
  User(
    backgroundImage: "${_urlPrefix}_woman_3.jpg",
    name: "심영",
    intro: "내가 고자라니",
  ),
  User(
    backgroundImage: "${_urlPrefix}_man_4.jpg",
    name: "교강용",
    intro: "더 이상의 자세한 설명은 생략한다.",
  ),
  User(
    backgroundImage: "${_urlPrefix}_woman_4.jpg",
    name: "김환희",
    intro: "뭣이 중한디",
  ),
  User(
    backgroundImage: "${_urlPrefix}_man_5.jpg",
    name: "뚱이",
    intro: "아뇨, 뚱인데요?",
  ),
  User(
    backgroundImage: "${_urlPrefix}_woman_5.jpg",
    name: "김주원",
    intro: "이게 최선입니까 확실해요?",
  ),
];

- _urlPrefix에 선언한 경로에서 이미지 값을 불러 옴

 

 

 

2️⃣ FriednScreen 기본 뼈대 만들기

import 'package:flutter/material.dart';

class FriendScreen extends StatelessWidget {
  const FriendScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("친구"),
      ),
    );
  }
}

 

 

 

3️⃣ ProfileCard 위젯 뼈대

import 'package:flutter/material.dart';
import 'package:flutter_kakao/models/user.dart';

class ProfileCard extends StatelessWidget {
  const ProfileCard({required this.user, Key? key}) : super(key: key);
  final User user;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {},
      child: ListTile(
        leading: CircleAvatar(
          radius: 20,
          backgroundImage: NetworkImage(
            user.backgroundImage,
          ),
        ),
        title: Text(
          user.name,
          style: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 16,
          ),
        ),
        subtitle: Text(
          user.intro,
          style: TextStyle(
            fontSize: 12,
          ),
        ),
      ),
    );
  }
}

- user를 DI로 정의해서 user.dart에서 선언한 값을 불러오도록 적용함

 

 

 

4️⃣ FriendScreen에 ProfileCard 활용하기

import 'package:flutter/material.dart';
import 'package:flutter_kakao/components/profile_card.dart';
import 'package:flutter_kakao/models/user.dart';

class FriendScreen extends StatelessWidget {
  const FriendScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: [
          const SizedBox(height: 10),
          ProfileCard(user: me),
          Divider(
            height: 1,
            color: Colors.black12,
          ),
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
            child: Row(
              children: [
                Text("친구"),
                const SizedBox(width: 6),
                Text("${friends.length}"),
              ],
            ),
          ),
          Expanded(
            child: ListView(
              children: List.generate(
                friends.length,
                (index) => ProfileCard(user: friends[index]),
              ),
            ),
          )
        ],
      ),
      appBar: AppBar(
        title: Text("친구"),
      ),
    );
  }
}

- 세로(Column)로 내 프로필과 친구 프로필 목록을 정렬

- Text("${friends.length}") :  user.dart에 선언했던 friends의 length(길이)값을 보여줌

Expanded(
        child: ListView(
          children: List.generate(
            friends.length,
            (index) => ProfileCard(user: friends[index]),
          ),
        ),
      )

- List를 세로로 확장(Expanded)으로 정렬

- friends의 길이만큼 0부터 오름차순으로 호출

🔎 List.generate
: length의 길이만큼 0부터 index -1까지 범위의 각 인덱스를 오름차순으로 호출하여 만든 값으로 리스트를 생성함