Flutter
Flutter Day 9-2: carrot market app (6)
@leem
2025. 1. 18. 17:01
1. 기본 흐름
- 데이터 모델링
- 앱에서 다룰 데이터를 정의하고 샘플 데이터를 생성합니다.
- class를 사용해 데이터를 체계적으로 관리합니다.
- UI 위젯 설계
- StatelessWidget: 변경되지 않는 고정 UI를 설계.
- StatefulWidget: 사용자 상호작용에 따라 변경되는 UI를 설계.
- 반복적인 UI 생성
- 리스트 데이터를 사용해 동적으로 UI를 생성합니다.
- ListView.builder 또는 List.generate를 활용.
- 페이지 전환 및 네비게이션 구현
- Navigator 또는 BottomNavigationBar로 화면 이동을 관리.
2. 주요 개념 설명
2.1 List.generate: 반복 UI 생성
Flutter에서 동일한 구조의 UI를 반복적으로 생성해야 할 때 사용하는 방법입니다.
주요 특징
- 정적 데이터 반복 생성에 적합.
- List.generate는 리스트의 크기를 지정하고, 각 인덱스별로 항목을 생성.
코드 예제: 간단한 반복 UI
List.generate(5, (index) {
return ListTile(
leading: Icon(Icons.star),
title: Text('아이템 $index'),
);
});
설명
- 첫 번째 매개변수: 생성할 항목 수 (5 → 5개의 항목 생성).
- 두 번째 매개변수: 각 인덱스별 생성 함수.
활용 예제: 동네생활 메뉴
class CardIconMenu extends StatelessWidget {
final List<IconMenu> iconMenuList;
const CardIconMenu({required this.iconMenuList});
@override
Widget build(BuildContext context) {
return Card(
elevation: 0.5,
margin: EdgeInsets.zero,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: List.generate(
iconMenuList.length,
(index) => ListTile(
leading: Icon(iconMenuList[index].iconData),
title: Text(iconMenuList[index].title),
),
),
),
),
);
}
}
2.2 ListView.builder: 동적 리스트 생성
ListView.builder는 데이터가 많거나 동적으로 생성될 때 사용합니다.
주요 특징
- 성능 최적화: 필요한 위젯만 화면에 렌더링.
- 데이터가 많을 때 적합.
코드 예제
ListView.builder(
itemCount: chatMessageList.length,
itemBuilder: (context, index) {
return ListTile(
leading: CircleAvatar(
backgroundImage: NetworkImage(chatMessageList[index].profileImage),
),
title: Text(chatMessageList[index].sender),
subtitle: Text(chatMessageList[index].message),
);
},
);
2.3 재사용 가능한 컴포넌트 설계
Flutter에서는 StatelessWidget을 사용해 반복적인 UI를 재사용 가능하게 설계할 수 있습니다.
이는 유지보수성과 코드 가독성을 크게 향상시킵니다.
예제: 사용자 프로필 카드
class ProfileCard extends StatelessWidget {
final String name;
final String imageUrl;
const ProfileCard({
required this.name,
required this.imageUrl,
});
@override
Widget build(BuildContext context) {
return Row(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(30),
child: Image.network(
imageUrl,
width: 60,
height: 60,
fit: BoxFit.cover,
),
),
const SizedBox(width: 16),
Text(name, style: Theme.of(context).textTheme.headline6),
],
);
}
}
활용
ProfileCard(
name: '홍길동',
imageUrl: 'https://picsum.photos/200',
);
2.4 Navigator와 페이지 전환
Flutter 앱에서 페이지 전환은 Navigator를 사용합니다.
기본 사용법
- 새로운 페이지로 이동
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
- 페이지 닫기
Navigator.pop(context);
예제: 네비게이션 구현
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('홈 화면')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('다음 페이지로 이동'),
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('두 번째 화면')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('뒤로 가기'),
),
),
);
}
}
3. '나의 당근' 앱 완성 코드 예제
3.1 데이터 모델 설계
class IconMenu {
final String title;
final IconData iconData;
IconMenu({required this.title, required this.iconData});
}
final List<IconMenu> iconMenuList = [
IconMenu(title: '내 동네 설정', iconData: Icons.location_on),
IconMenu(title: '키워드 알림', iconData: Icons.notifications),
];
3.2 앱 전체 UI 구성
class MyCarrotPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('나의 당근'),
),
body: ListView(
children: [
CardIconMenu(iconMenuList: iconMenuList), // 동네 설정 메뉴
// 다른 컴포넌트 추가 가능
],
),
);
}
}
4. 결론: Flutter 앱 개발의 핵심 요약
- 데이터 모델링: class로 데이터를 체계적으로 관리.
- 반복적인 UI 생성: List.generate, ListView.builder로 효율적으로 구현.
- 재사용 가능한 컴포넌트: StatelessWidget을 설계해 유지보수성 향상.
- 네비게이션: Navigator로 페이지 전환을 간단히 관리.
Flutter의 유연성과 재사용성을 적극 활용해 더 나은 앱을 만들어 보세요!