row는 수평 레이아웃
여러개의 children을 가질 수 있다.
list는 수직 레이아웃
이것도 여러개의 children을 가질 수 있다.
decoration 추상화 클래스
추상클래스는 new를 하지 못한다.
어떤 것들의 부모이기 떄문에 , 추상화 시킨 클래스이다.
그럼 어떤 것들의 부모인지 추측을 해봐야된다.
모든 도형의 어머니 데코레이션
Decoration의 구현체는 BoxDecoration
컴파일 오류가 나지 않는다.
컨테이너 BoxDecoration 설정
Recipe Pages 전체 코드
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../components/recipe_title.dart';
class RecipePage extends StatelessWidget {
const RecipePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _appbar(),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: ListView(
children: [
RecipeTitle(),
Row(
children: [
Container(
width: 60,
height: 80,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
border: Border.all(color: Colors.black12),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.food_bank,
color: Colors.redAccent,
size: 30,
),
Text(
"ALL",
style: TextStyle(color: Colors.black87),
),
],
),
),
],
),
],
),
),
);
}
AppBar _appbar() {
return AppBar(
actions: [
Icon(CupertinoIcons.search),
SizedBox(width: 15),
Icon(
CupertinoIcons.heart,
color: Colors.redAccent,
),
SizedBox(width: 15),
],
);
}
}
JavaScript
복사
Coloum의 mainAxisalignment는 디폴트 값이 start
row의 디폴트 값은 센터
왼쪽정렬을 하고 싶다면??
row에 가운데 정렬을 하고 싶다면??
컬럼도 블락이다??
다른 속성 안에서는 블락 성질이 있는데
칼럼만의 속성은 블락이 아니고 인라인이다.
완성된 디자인 컴포넌트로 만들기
반복되는 구간, 컨테이너를 마우스 우클릭해서 위젯 메뉴 선택
위젯 이름은 파스칼 표기법
해당 코드블럭들을 잘라내기해서 파일로 따로 빼준다.
컴포넌트 안에 넣을 때는 이렇게 언더바 표기법을 지켜준다.
동일한 디자인만 뽑아낸다는 것은 컴포넌트화 되었다고 할 수 없다.
디자인이 만들어 지고 난 뒤에 상태변경이 없는 위젯은 stateless 위젯이라고 한다. 하지만, 그려지고 나서 클릭이라는 행위 같은거에 모양이 바뀌면은 stateful위젯이라고 하고, 그런 요소들에게는 final을 걸면 안된다.
stateless 위젯의 변수는 전부 final로 해도 된다.
생성자를 사용할 때 중괄호를 사용해서 선택적 매개변수를 사용하도록 하낟. 키값을 적을 수 있으니까!
final로 선언하면 따로 어떤 타입인지 명시하지 않아도 된다.
파라메터를 꼭 넣도록 강제하고 싶다면, requried를 붙인다.
mIcon과 ${text}로 동적으로 변경이 되는 위젯이 완성이 되었다. 재사용가능한 위젯
이렇게 위젯을 만들고, 재사용하면 된다.
이렇게 재사용이 가능하다.
recipe_menu_item 전체코드
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class RecipeMenuItem extends StatelessWidget {
IconData mIcon;
String text;
RecipeMenuItem({required this.mIcon, required this.text});
@override
Widget build(BuildContext context) {
return Container(
width: 60,
height: 80,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
border: Border.all(color: Colors.black12),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
mIcon,
color: Colors.redAccent,
size: 30,
),
Text(
"${text}",
style: TextStyle(color: Colors.black87),
),
],
),
);
}
}
JavaScript
복사
ListView 속성 scrollDirection
row는 가로라서 스크롤을 넣기 어려운데, 이런 식으로 Listview를 scrolldirection을 사용하면 인스타 그램 스토리를 넘기는 것 처럼 사용할 수 있다.
이렇게 컴포넌트화 해야지 가독성이 좋아지고 , 같이 일하기 편하다.
이렇게 빼는 연습을 해야지 가독성이 좋아지고, 생성자도 잘 이해되고 그렇다.
recipe menu도 따로 빼놓자
이런 식으로 주석을 달아주자.
코드를 완성하고 째라
Padding 도 우클릭
모든 디자인은 body안에 다들어가있게 만든다. 페이지이름_바디
모든 페이지가 이 구조
Scaffold 구조
액션 버튼도 구조로
drawer 위젯 사이드바로 메뉴가 튀어나오는 구조
Column 속성
왜 컬럼의 영역이 하나도 나오지 않을까??
모든 위젯에는 제약 조건이라는 것이 있다.
컬럼의 제약조건이란 무엇일까???
contstraint라고 검색해보자.
최소값이 0으로 되어있는 것을 볼 수 있다. 자식이 없으니 그냥 0으로 보이는 것
부모객체에 사이즈를 줌으로서 칼럼의 요소에 크기가 정해졌다.
플러터는 html과 다르게,
column 세로로는 블락이고 가로는 인라인이다.
row는 가로가 블락이고 세로는 인라인이다.
컬럼은 인라인이기 떄문에, 자식의 요소만큼 늘어난다.
그러므로 위에서 밑으로 내려가는 디자인을 할때, 미리 사이즈를 키워 놓아야 된다.
컨테이너는 자식이 없으면 블락이 되고,
자식이 있으면 인라인이 된다.
ListView 속성
이걸 보자마자,
아, ListView의 제약조건이 width의 최소값이 double.infinite구나
그리고 height의 최소값은 0이구나 추론할 수 있다.
주요 요소의 속성 정리 : 외워라!!!
칼럼은 칼세 (크로스 엑시아스 정렬로 설정가능)
해당 요소를 왼쪽으로 붙이고 싶으면 왼쪽 정렬을 하면 된다.
노란 박스를 가운데로 옮기고 싶으면 컨테이너를 row로 감싸며 된다.
그럼 블락의 성질을 가지고, 기본 디폴트 mainAxias가 start이므로 center로 변경을 해줘야 된다.
다시 한 번 요소 특징 외우기
즉 해결을 할려면 박스를 분리시켜야 된다.
요런 구조로 짜야된다.
상단 컬럼을 컴포넌트화한다. top()
정렬을 적용하고 싶다면??
따로 뺀 컬럼을 컨테이너로 다시 감싸서,
return 타입을 Widget으로 변환 시킨다.
그리고 해당 Container를 블럭화 (doublie.infinity)시키면 가로로 전체 공간을 블럭으로 잡는다.
그리고 내부 칼럼을 왼쪽 정렬로 해야지 해당 그림처럼 표시가 된다.
해당 row가 있어도, 부모로 Container로 감싸서 통제하는 것이 편하다.
가로 박스에는 굳이 height를 걸 필요가 없다.
row는 그대로 두고 컬럼은 늘려준다.
ROW는 그대로 두고 컬럼은 늘려준다!! 외워라
배치를 하기 위해서 필 수 요소!!!
컬럼요소는 SizedBox로 끝까지 늘려준다.
Row는 굳이 감쌀 필요없다.
Container같이 한개 요소에는 Align 부모로 감싼다.
그리고 ctrl + space로 alignment 속성을 줄 수 가 있다.
이렇게 부모가 주는 속성이 위젯화 시킨 내부요소의 속성에 영향을 주면 안된다.
정렬의 핵심은 블락이다!!!
단일 요소는 Align으로 감싸면 된다.
단일 요소가 아니면 그냥 내부에서 정의 하면 된다.
부모안의 인라인 요소는 부모의 정렬 속성의 영향을 받는다.
Recipe_
안에 무엇이 들어가도 무너지지 않게 하기 위해서 SizedBox를 이용하라.