seong
#3 Dot_node CustomAppBar 만들기 (PreferSizeWidget 상속) 본문
TODO
* Custom AppBar 만들기
만들기 전 알아둘 사항
- appBar는 Material에서 제공한다.
- scaffold 하위 위젯으로 사용을 할 수 있다.
- CustomAppBar를 만들기 위해서 PreferSizeWidget을 상속 받아 사용한다( 이 부분이 없으면 Custom을 할 수 없었다. )
1. appBar에 CustomAppBar() 호출
2.PreferredSizeWidget 상속
Size가 필요하므로 아래 처럼 Size를 선언해 주어야한다.
3. 이제 필요한 위젯들을 작성해주기만 하면 된다. Search-Bar를 만드는 부분만 기록
SizedBox를 사용한 이유 : TextField를 사용할때 width를 설정해주지 않으면 가로가 무한대로 늘어나는 에러가 발생해서 SizedBox를 사용.
InputDecoration으로 디자인
filled : TextField의 백그라운드 색상 여부
contentPadding : Icon,Text의 위치를 모두 일정하게 조정 ( vertical 를 사용해 세로 중앙으로 조정 )
prefixIcon : TextField의 가장 왼쪽 아이콘 ( 오른쪽은 suffixIcon )
enabledBorder : 선택 되지 않았을 경우 디자인
focusedBorder : 선택 되었을 경우 디자인
전체 소스
class CustomAppBar extends StatefulWidget implements PreferredSizeWidget {
CustomAppBar({super.key});
@override
State<CustomAppBar> createState() => _CustomAppBar();
@override
Size get preferredSize => Size.fromHeight(60);
}
class _CustomAppBar extends State<CustomAppBar> {
late FocusNode _focusNode;
@override
void initState() {
super.initState();
_focusNode = FocusNode();
}
@override
void dispose() {
_focusNode.dispose();
super.dispose();
}
final TextStyle fontStyle = TextStyle(color: Colors.grey.shade600, fontSize: 16, fontWeight: FontWeight.w600);
@override
Widget build(BuildContext context) {
return Container(
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Icon(
Icons.home,
color: Colors.black,
),
Row(
children: [
TextButton(
onPressed: (() {}),
child: Text(
"사람",
style: fontStyle,
),
),
TextButton(
onPressed: (() {}),
child: Text(
"작업",
style: fontStyle,
),
),
TextButton(
onPressed: (() {}),
child: Text(
"채용",
style: fontStyle,
),
),
TextButton(
onPressed: (() {}),
child: Text(
"취업",
style: fontStyle,
),
),
],
),
SizedBox(
width: 600.w,
child: TextField(
focusNode: _focusNode,
keyboardType: TextInputType.text,
decoration: InputDecoration(
filled: true,
fillColor: Colors.grey.shade100,
hintText: "검색",
border: InputBorder.none,
contentPadding: EdgeInsets.symmetric(vertical: 8.0),
prefixIcon: Icon(Icons.search),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(30)),
borderSide: BorderSide(
color: Colors.grey.shade200,
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(30)),
borderSide: BorderSide(
color: Colors.grey.shade200,
),
),
),
),
),
Row(
children: [
IconButton(
onPressed: () {},
icon: Icon(
Icons.email,
color: Colors.black,
),
),
IconButton(
onPressed: () {},
icon: Icon(
Icons.notifications,
color: Colors.black,
),
),
CircleAvatar(
// 추후 만약 null이면 null일때 이미지 보여주도록 하기.
backgroundImage: AssetImage("assets/profile.jpeg")),
Image.asset("assets/testlogo.jpg"),
],
),
],
),
),
),
);
}
}
'Flutter > dot' 카테고리의 다른 글
#4 Dot_node RangeError (index): Index out of range: no indices are valid: 1 에러 해결하기 (0) | 2023.07.26 |
---|---|
#2 Dot_node API Get 요청하기 (0) | 2023.06.18 |
#1 Dot_node 위젯 데이터 서버와 통신 (0) | 2023.06.13 |
Modal으로 로그인 페이지 구현하기 (0) | 2023.05.19 |
서버와 통신을 위한 connector 생성 (0) | 2023.05.19 |