6일차 과제 링크 👉 6일차 과제
기존 ListTile 활용
ListTile(
title: Text('이테디'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/100/100'),
),
)
Constructor Parameter
ContactTile('이테디', '010-1000-2000', 'https://picsum.photos/100/100')
NamedParameter
ContactTile(
name: '이테디',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/100/100'
)
ListView(
children: [
ListTile(
title: Text('이테디'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/100/100'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('밀리'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/50/50'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('크리스'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/75/75'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('주노'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/70/70'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('해리'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/60/60'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('벨라'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/80/80'),
),
trailing: Icon(Icons.call),
),
ListTile(
title: Text('헬렌'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/110/110'),
),
trailing: Icon(Icons.call),
),
],
),
CustomWidget을 사용하면 코드 유지보수, 관리가 쉬워진다.
ContactTile.dart 파일 생성
import 'package:flutter/material.dart';
class ContactTile extends StatelessWidget {
const ContactTile({Key? key, required this.name, required this.phone, required this.imgUrl}) : super(key: key);
final String name;
final String phone;
final String imgUrl;
Widget build(BuildContext context) {
return ListTile(
title: Text('이테디'),
subtitle: Text('010-1000-2000'),
leading: CircleAvatar(
backgroundImage: NetworkImage('https://picsum.photos/100/100'),
),
trailing: Icon(Icons.call),
);
}
}
ContactTile 위젯을 자동완성으로 생성하면 자동으로 상단에
import 'package:contact_app/ContactTile.dart';
body: ListView(
children: [
ContactTile(),
하지만 위 ContactTile 위젯 파일은 문자열이 그대로 들어가있어 수정이 번거롭다.
유동적으로 바꾸기 위해서는 사용할 문자열, 속성을 변수로 만들어서 사용하면 된다.
import 'package:flutter/material.dart';
class ContactTile extends StatelessWidget {
const ContactTile({Key? key, required this.name, required this.phone, required this.imgUrl}) : super(key: key);
final String name;
final String phone;
final String imgUrl;
Widget build(BuildContext context) {
return ListTile(
title: Text(name),
subtitle: Text(phone),
leading: CircleAvatar(
backgroundImage: NetworkImage(imgUrl),
),
trailing: Icon(Icons.call),
);
}
}
// ignore_for_file: prefer_const_literals_to_create_immutables, prefer_const_constructors, file_names
import 'package:contact_app/ContactTile.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
elevation: 0,
title: Text('내 연락처'),
centerTitle: false,
actions: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(Icons.search),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(Icons.more_vert),
)
],
),
body: ListView(
children: [
ContactTile(
name: '이테디',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/100/100',
),
ContactTile(
name: '밀리',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/50/50',
),
ContactTile(
name: '크리스',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/75/75',
),
ContactTile(
name: '주노',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/60/60',
),
ContactTile(
name: '해리',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/80/80',
),
ContactTile(
name: '벨라',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/110/110',
),
ContactTile(
name: '헬렌',
phone: '010-1000-2000',
imgUrl: 'https://picsum.photos/150/150',
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(icon: Icon(Icons.contact_phone), label: '연락처'),
BottomNavigationBarItem(icon: Icon(Icons.history), label: '통화기록'),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: '설정'),
],
),
)
);
}
}