Git
//Git의 주요 명령어들을 일반적인 워크플로우에 따라 그룹화하여 설명하겠습니다.
## 시작하기
### 저장소 생성 및 복제
1. **git init**
- 새로운 Git 저장소를 생성합니다.
- 사용법: 프로젝트 폴더에서 `git init` 명령어를 실행합니다.
- 예: `git init my_new_project`
2. **git clone**
- 원격 저장소를 로컬 컴퓨터로 복사합니다.
- 사용법: `git clone [원격 저장소 URL]`
- 예: `git clone https://github.com/username/repository.git`
## 일상적인 작업
### 변경사항 확인 및 준비
1. **git status**
- 현재 작업 디렉토리의 상태를 보여줍니다.
- 변경된 파일, 스테이징된 파일 등을 확인할 수 있습니다.
- 사용법: `git status`
2. **git add**
- 변경사항을 스테이징 영역에 추가합니다.
- 사용법: `git add [파일명]` 또는 모든 변경사항을 추가하려면 `git add .`
- 예: `git add index.html` 또는 `git add .`
3. **git diff**
- 변경사항을 상세히 보여줍니다.
- 사용법: `git diff` (스테이징되지 않은 변경사항 확인)
- 스테이징된 변경사항 확인: `git diff --staged`
### 변경사항 저장
1. **git commit**
- 스테이징된 변경사항을 저장소에 기록합니다.
- 사용법: `git commit -m "커밋 메시지"`
- 예: `git commit -m "Add new feature: login page"`
### 원격 저장소와 동기화
1. **git push**
- 로컬의 커밋을 원격 저장소에 업로드합니다.
- 사용법: `git push origin [브랜치명]`
- 예: `git push origin main`
2. **git pull**
- 원격 저장소의 변경사항을 가져와 현재 브랜치에 병합합니다.
- 사용법: `git pull origin [브랜치명]`
- 예: `git pull origin main`
3. **git fetch**
- 원격 저장소의 변경사항을 로컬에 가져오지만, 자동으로 병합하지는 않습니다.
- 사용법: `git fetch [원격 저장소 이름]`
- 예: `git fetch origin`
- **설명**: `git fetch`는 원격 저장소의 최신 커밋과 브랜치 정보를 로컬에 업데이트합니다. 이를 통해 원격 저장소의 상태를 확인할 수 있으며, 이후 필요에 따라 수동으로 병합할 수 있습니다.
4. **git cherry-pick**
- 특정 커밋을 선택하여 현재 브랜치에 적용합니다.
- 사용법: `git cherry-pick [커밋 해시]`
- 예: `git cherry-pick abc123`
- **설명**: `git cherry-pick`은 특정 기능이나 버그 수정을 다른 브랜치에 적용하고 싶을 때 유용합니다. 선택한 커밋만 현재 작업 중인 브랜치에 복사하여 적용합니다.
## 브랜치 작업
### 브랜치 관리
1. **git branch**
- 브랜치 목록 확인: `git branch`
- 새 브랜치 생성: `git branch [브랜치명]`
- 브랜치 삭제: `git branch -d [브랜치명]`
2. **git checkout** 또는 **git switch**
- 다른 브랜치로 전환합니다.
- 사용법: `git checkout [브랜치명]` 또는 `git switch [브랜치명]`
- 새 브랜치 생성 및 전환: `git checkout -b [새 브랜치명]`
### 브랜치 재배치
1. **git rebase**
- 한 브랜치의 커밋들을 다른 브랜치의 끝에 재배치하여 히스토리를 선형적으로 만듭니다.
- 사용법: `git rebase [기준 브랜치]`
- 예: `git rebase main`
- **설명**: `git rebase`는 커밋 히스토리를 깔끔하게 유지하는 데 유용합니다. 특히, 협업 시 다른 사람의 변경사항을 내 작업 위로 재배치하여 충돌을 최소화할 수 있습니다. 단, 이미 공유된 브랜치에서 사용 시 주의가 필요합니다.
### 브랜치 병합
1. **git merge**
- 한 브랜치의 변경사항을 다른 브랜치에 통합합니다.
- 사용법: (대상 브랜치로 이동 후) `git merge [병합할 브랜치명]`
- 예: `git checkout main` 후 `git merge feature-branch`
## 변경사항 되돌리기
1. **git reset**
- 특정 커밋으로 되돌아갑니다.
- 사용법: `git reset [옵션] [커밋 해시]`
- 예: `git reset --hard HEAD~1` (가장 최근 커밋을 취소하고 변경사항도 삭제)
2. **git revert**
- 특정 커밋의 변경사항을 취소하는 새로운 커밋을 만듭니다.
- 사용법: `git revert [커밋 해시]`
- 예: `git revert abc123`
## 작업 임시 저장
1. **git stash**
- 현재 작업 중인 변경사항을 임시로 저장합니다.
- 사용법: `git stash save "스태시 메시지"`
- 저장된 stash 적용: `git stash apply` 또는 `git stash pop`
## 히스토리 확인
1. **git log**
- 커밋 히스토리를 보여줍니다.
- 사용법: `git log`
- 간단히 보기: `git log --oneline`
//이러한 명령어들을 이해하고 사용하면 Git의 기본적인 워크플로우를 따라갈 수 있습니다. 처음에는 `git init` 또는 `git clone`으로 시작하여, `git add`와 `git commit`으로 변경사항을 저장하고, `git push`와 `git pull`로 원격 저장소와 동기화하는 과정을 반복하게 됩니다. 브랜치 작업이 필요할 때는 `git branch`와 `git checkout`을 사용하고, 작업을 완료한 후에는 `git merge`로 변경사항을 통합합니다. 이 과정에서 `git status`와 `git log`를 자주 사용하여 현재 상태와 히스토리를 확인하는 것이 좋습니다.
//비슷해 보이는 Git 명령어들의 차이점을 상세히 설명드리겠습니다.
1. Fork vs Clone
- Fork
* 원격 저장소(다른 사람의 깃헙 저장소)를 내 깃헙 계정으로 복사하는 기능
* 완전히 웹 기반 작업으로, 실제 내 계정에 새로운 저장소가 생성됨
* 오픈소스 프로젝트에 기여하거나 다른 사람의 프로젝트를 기반으로 새 프로젝트를 시작할 때 사용
* GitHub, GitLab 같은 플랫폼에서 제공하는 기능
- Clone
* 원격 저장소의 코드를 내 로컬 컴퓨터로 전체 복제하는 명령어
* `git clone [저장소 URL]`로 실행
* 전체 프로젝트 히스토리와 브랜치 등을 로컬에 다운로드
* 실제 작업을 시작하기 위해 코드를 내려받을 때 사용
2. Merge vs Rebase
- Merge
* 두 브랜치의 작업 내용을 하나의 새로운 커밋으로 통합
* 브랜치의 모든 히스토리를 그대로 보존
* 브랜치 작업 내용을 모두 남기고 싶을 때 사용
* 복잡한 브랜치 작업 히스토리가 그대로 남음
- Rebase
* 한 브랜치의 커밋들을 다른 브랜치의 끝에 순차적으로 재적용
* 브랜치 히스토리를 선형적이고 깔끔하게 만듦
* 브랜치 작업 히스토리를 한 줄로 정리하고 싶을 때 사용
* 커밋 히스토리를 깔끔하게 정리할 수 있지만, 공유된 브랜치에서는 주의 필요
3. Push vs Pull
- Push
* 로컬 저장소의 변경 사항을 원격 저장소로 업로드
* 내가 작업한 코드를 공유된 저장소에 올릴 때 사용
* `git push origin [브랜치명]`으로 실행
- Pull
* 원격 저장소의 최신 변경 사항을 로컬 저장소로 가져와 자동으로 병합
* 다른 개발자들의 최신 작업 내용을 내 로컬에 반영할 때 사용
* `git pull origin [브랜치명]`으로 실행
* Pull = Fetch + Merge의 과정
4. Fetch vs Pull
- Fetch
* 원격 저장소의 최신 변경 사항만 다운로드
* 실제로 내 로컬 코드에는 변경을 주지 않음
* 변경 내용을 먼저 확인하고 싶을 때 사용
* 안전하게 원격 변경 사항을 확인할 수 있음
- Pull
* 원격 저장소의 변경 사항을 다운로드하고 자동으로 병합
* 바로 로컬 코드에 변경 사항 적용
* 최신 상태로 빠르게 업데이트하고 싶을 때 사용
5. Stash vs Commit
- Stash
* 현재 작업 중인 변경 사항을 임시로 저장
* 아직 커밋할 준비가 되지 않은 작업을 잠시 치워둘 때 사용
* `git stash`로 저장, `git stash pop`으로 다시 불러오기
* 브랜치 변경 시 현재 작업을 방해하지 않고 잠시 보관 가능
- Commit
* 변경 사항을 확정하고 저장소 히스토리에 영구적으로 기록
* 작업의 스냅샷을 만들고 설명을 추가
* 로컬 저장소의 변경 이력을 만들 때 사용
* `git commit -m "커밋 메시지"`로 실행
//이 외에도 많은 Git 명령어들이 있지만, 주로 사용되는 명령어들의 차이점을 이해하면 Git 사용에 큰 도움이 됩니다. 각 명령어는 고유의 목적과 상황에 맞게 사용되므로, 실제 프로젝트에서 어떤 상황에 어떤 명령어를 사용해야 하는지 익숙해지는 것이 중요합니다.
https://learngitbranching.js.org/?locale=ko
**git command를 연습해볼 수 있는 사이트
MVVM
//Flutter의 상태 관리, GetX, MVVM 모델, Riverpod, Firebase, JSON 파일의 관계에 대해 리서치
1. MVVM 모델과 GetX의 관계
- MVVM (Model-View-ViewModel)
* 소프트웨어 디자인 패턴으로, 애플리케이션 로직을 세 가지 구성 요소로 분리
* Model: 데이터와 비즈니스 로직
* View: UI 화면
* ViewModel: Model과 View 사이의 중재자 역할
- GetX와 MVVM
* GetX는 MVVM 패턴 구현을 매우 쉽게 만들어줌
* GetX Controller가 ViewModel의 역할을 수행
* 상태 관리, 의존성 주입, 라우팅을 통합적으로 지원
* 코드 예시:
class UserController extends GetxController {
// Model
final user = User().obs;
// ViewModel의 로직
void updateUser(User newUser) {
user.value = newUser;
}
}
2. Riverpod과의 관계
- Riverpod
* 의존성 주입(Dependency Injection)과 상태 관리를 위한 최신 라이브러리
* GetX와 유사하지만 더 함수형 프로그래밍 접근
* 컴파일 타임 안전성 제공
* 코드 예시:
final userProvider = StateNotifierProvider<UserController, User>((ref) {
return UserController();
});
3. Firebase 연동
- 상태 관리와 Firebase
* GetX나 Riverpod은 Firebase 데이터를 쉽게 관리 가능
* Firebase의 실시간 데이터베이스와 완벽히 통합
* 코드 예시 (GetX):
class UserController extends GetxController {
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
final user = User().obs;
Future<void> fetchUser() async {
var userData = await _firestore.collection('users').doc(id).get();
user.value = User.fromFirestore(userData);
}
}
4. JSON 데이터 처리
- JSON 파일과 상태 관리
* GetX, Riverpod은 JSON 데이터 파싱과 상태 관리 통합
* 모델 클래스를 통해 JSON 데이터 쉽게 변환
* 코드 예시:
class User {
// JSON으로부터 객체 생성
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
email: json['email']
);
}
// 객체를 JSON으로 변환
Map<String, dynamic> toJson() => {
'name': name,
'email': email
};
}
5. 통합 아키텍처 예시
// Model
class User {
String name;
String email;
User({required this.name, required this.email});
// JSON 변환 메서드
factory User.fromJson(Map<String, dynamic> json) => User(
name: json['name'],
email: json['email']
);
}
// GetX ViewModel
class UserController extends GetxController {
final Rx<User?> currentUser = Rx<User?>(null);
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
// Firebase에서 사용자 데이터 가져오기
Future<void> fetchUserFromFirebase(String userId) async {
try {
var userData = await _firestore.collection('users').doc(userId).get();
currentUser.value = User.fromJson(userData.data()!);
} catch (e) {
print('Error fetching user: $e');
}
}
// JSON 파일에서 사용자 데이터 로드
Future<void> loadUserFromJson(String jsonPath) async {
String jsonString = await rootBundle.loadString(jsonPath);
Map<String, dynamic> jsonMap = json.decode(jsonString);
currentUser.value = User.fromJson(jsonMap);
}
}
// View
class UserProfileView extends GetView<UserController> {
@override
Widget build(BuildContext context) {
return Obx(() =>
controller.currentUser.value != null
? Text(controller.currentUser.value!.name)
: CircularProgressIndicator()
);
}
}
## 주요 특징 및 장점
### MVVM 패턴 구현
MVVM (Model-View-ViewModel) 패턴은 UI 로직과 비즈니스 로직을 분리하여 코드의 구조를 개선합니다. 이 패턴을 통해 테스트 가능성이 향상되고, 코드의 재사용성이 증가합니다. Flutter에서 MVVM을 구현하면 UI (View)와 데이터 처리 로직 (ViewModel)을 명확히 분리할 수 있습니다.
### Firebase 연동
Firebase는 실시간 데이터베이스, 인증, 호스팅 등 다양한 백엔드 서비스를 제공합니다. Flutter 앱에서 Firebase를 연동하면 서버리스 아키텍처를 구현할 수 있으며, 실시간 데이터 동기화와 사용자 인증 등의 기능을 쉽게 구현할 수 있습니다.
### JSON 데이터 처리
JSON은 데이터 교환을 위한 경량 포맷으로, API 통신에서 널리 사용됩니다. Flutter에서 JSON 데이터를 효율적으로 처리하면 서버와의 통신, 로컬 데이터 저장 등을 원활하게 수행할 수 있습니다. 'dart:convert' 라이브러리를 사용하여 JSON 데이터를 Dart 객체로 변환하고 관리할 수 있습니다.
### 반응형 상태 관리
반응형 상태 관리는 데이터의 변화를 자동으로 감지하고 UI를 업데이트하는 방식입니다. GetX, Riverpod 등의 라이브러리를 사용하면 상태 변화에 따른 UI 업데이트를 효율적으로 처리할 수 있어, 앱의 반응성과 성능이 향상됩니다.
### 코드 재사용성 증가
상태 관리 솔루션을 사용하면 비즈니스 로직을 UI와 분리하여 관리할 수 있습니다. 이로 인해 동일한 로직을 여러 위젯에서 재사용할 수 있어, 코드의 중복을 줄이고 유지보수성을 높일 수 있습니다.
### 유지보수 용이
체계적인 상태 관리와 아키텍처 패턴 적용으로 코드의 구조가 개선되어 유지보수가 용이해집니다. 특히 대규모 프로젝트에서 이러한 접근 방식은 장기적인 개발 및 유지보수 비용을 절감하는 데 도움이 됩니다.
## 상태 관리 라이브러리 비교
Provider
장점가장 간단하고 가벼운 상태 관리 솔루션Flutter 공식 라이브러리에서 권장학습 곡선이 가장 낮음작은 규모의 앱에 적합의존성 주입과 상태 관리를 동시에 할 수 있음
단점대규모 앱에서는 코드가 복잡해질 수 있음복잡한 상태 관리에는 한계가 있음
GetX
장점상태 관리, 의존성 주입, 라우팅을 통합코드 줄 수를 획기적으로 줄일 수 있음반응형 프로그래밍 지원성능이 매우 우수함상태 관리와 비즈니스 로직 분리가 용이
단점학습 곡선이 다소 가파름라이브러리 크기가 큼과도한 기능으로 인한 복잡성
Riverpod
장점컴파일 타임 안전성 제공함수형 프로그래밍 접근테스트 용이성의존성 관리가 매우 강력코드 재사용성 높음
단점학습 난이도 높음초기 설정이 복잡할 수 있음러닝 커브가 가파름
## 프로젝트 규모별 상태 관리 선택 가이드
### 소규모 프로젝트 (MVP, 간단한 앱)
추천 라이브러리: Provider특징빠른 개발 속도최소한의 보일러플레이트 코드학습 난이도 낮음간단한 상태 관리에 최적
### 소규모 프로젝트: ProviderProvider는 Flutter 팀에서 공식적으로 추천하는 간단한 상태 관리 솔루션입니다. 작은 규모의 프로젝트에서는 Provider를 사용하여 간단하게 상태를 관리할 수 있으며, 학습 곡선이 낮아 빠르게 적용할 수 있습니다.
### 중규모 프로젝트 (비즈니스 앱, 중간 복잡도)
추천 라이브러리: GetX특징반응형 상태 관리라우팅, 의존성 주입 통합성능과 개발 속도 모두 만족확장성 좋음
### 중간 규모: GetXGetX는 상태 관리, 라우팅, 종속성 주입 등을 포함한 종합적인 솔루션을 제공합니다. 중간 규모의 프로젝트에서 GetX를 사용하면 코드를 간결하게 유지하면서도 강력한 기능을 활용할 수 있습니다.
### 대규모 프로젝트 (엔터프라이즈 앱, 복잡한 비즈니스 로직)
추천 라이브러리: Riverpod특징강력한 타입 안전성테스트 용이복잡한 의존성 관리함수형 프로그래밍 지원
### 대규모, 복잡한 앱: RiverpodRiverpod는 Provider의 개선된 버전으로, 대규모 및 복잡한 앱에서 더 나은 타입 안정성과 테스트 가능성을 제공합니다. 특히 컴파일 타임 안정성을 제공하여 런타임 에러를 줄일 수 있습니다.### 실시간 데이터: GetX + Firebase실시간 데이터를 다루는 앱의 경우, GetX의 반응형 프로그래밍 기능과 Firebase의 실시간 데이터베이스를 결합하면 효과적입니다. GetX의 Rx 타입과 Firebase의 스트림을 연동하여 실시간 데이터 변화를 UI에 즉시 반영할 수 있습니다.
선두원 튜터님 조언
상태관리 기술 스택
프로바이더, GetX, Riverpod
이 세 기술 스택은 소규모, 중규모, 대규모 프로젝트에서 모두 사용 가능합니다
기술 스택 선택은 팀의 익숙도와 프로젝트 특성에 따라 결정됩니다
GetX의 특징
상태 관리, 의존성 주입, 라우팅을 통합한 프레임워크적 특성을 가집니다.
다양한 기능을 제공하지만, 라이브러리 크기가 크고 간혹 버그가 있을 수 있습니다.
Bloc
가장 자유도가 낮은 상태관리 기술로, 사용 방법이 정해져 있습니다.
실시간 데이터 처리
실시간 데이터 처리는 주로 웹소켓과 같은 지속적인 연결을 통해 이루어집니다.
채팅 기능 등에서 주로 사용됩니다.
Firebase와 상태관리 도구는 독립적으로 사용 가능하며, 특정 조합이 반드시 필요한 것은 아닙니다.
MVVM 패턴
MVVM은 코드 분리와 유지보수를 위한 아키텍처 패턴입니다.
초기에는 파일 분리 정도로 이해하고, 점차 코드 배치의 최적화를 고민하게 됩니다.
Flutter UI
Flutter UI 구조를 위젯, 뷰, 컴포넌트, 스크린으로 분류
## 위젯 (Widget)
위젯은 Flutter UI의 기본 구성 요소입니다. 모든 UI 요소는 위젯으로 표현됩니다. 위젯은 다음과 같이 분류할 수 있습니다:
- **기본 레이아웃 위젯**: Container, Row, Column, Stack 등
- **스타일링 위젯**: Decoration, BoxDecoration 등
- **입력 위젯**: TextField, GestureDetector 등
위젯은 재사용 가능하며, 조합하여 더 복잡한 UI를 구성할 수 있습니다.


위의 화면은 단순히 모든 위젯을 노란박스로 표시한 상태입니다. 하지만 "UI 구조를 잡는 관점"에서 다시 설명하자면 Widget은 본인이 만든 위젯의 가장 작은 단위를 의미하게 됩니다. 개발자마다 판단의 기준이 다르기 때문에 위의 화면을 보고 누구는 위젯이 20개가 나올 수도 있고, 누구는 5개만 나오는 상황이 벌어질 수도 있죠. 우리는 협업과 유지보수를 위해 일단 명확하게 기준을 세우고 위젯을 분리하는 작업이 필요합니다.
## 컴포넌트 (Component)
컴포넌트는 재사용 가능한 UI 요소의 집합입니다. 여러 위젯을 조합하여 만든 사용자 정의 위젯으로 볼 수 있습니다. 예를 들어:
- 커스텀 버튼
- 카드 레이아웃
- 헤더 섹션
컴포넌트는 코드 중복을 줄이고 일관된 디자인을 유지하는 데 도움이 됩니다.
- (파란 박스 == component)
- "쿠폰, 포인트, 내리뷰" 위젯은 아이콘과 타이틀이 중복되고 숫자가 있는 부분을 require로 받지 않는다면 내 리뷰일 때는 숫자를 보여주지 않도록 할 수 있으므로 컴포넌트화 할 수 있습니다.
- 하얀색 보드같이 생긴 위젯은 단순히 Layer 또는 Card 같은 역할을 하기 때문에 컴포넌트화 할 수 있습니다.
- 하단 내비게이션 바의 버튼들도 구성이 모두 같기 때문에 컴포넌트화 할 수 있습니다.
## 뷰 (View)
뷰는 특정 화면의 일부분을 나타내는 더 큰 단위의 UI 구성요소입니다. 뷰는 여러 컴포넌트와 위젯으로 구성될 수 있으며, 주로 다음과 같은 경우에 사용됩니다:
- 네트워크 상태에 따른 인터페이스 (로딩, 에러, 데이터 표시)
- 화면의 주요 섹션 (예: 프로필 뷰, 설정 뷰)
뷰는 스크린보다 작지만 개별 위젯이나 컴포넌트보다는 큰 단위입니다.
**네트워크 상태에 따른 인터페이스(error, loading, data)를 View로 분류하는 접근 방식은 매우 합리적
**네트워크 상태 인터페이스를 View로 분류하는 이유
유연성: 다양한 네트워크 상태(로딩, 에러, 데이터)를 독립적인 View로 관리하면 재사용성과 유지보수성이 향상됩니다.
일관성: 모든 화면에서 동일한 로딩, 에러 처리 방식을 적용할 수 있습니다.
가독성: Screen 코드에서 상태에 따른 View 전환 로직을 명확하게 볼 수 있어 코드 이해가 쉬워집니다.
분리된 관심사: 각 상태별 UI 로직을 별도의 View로 분리함으로써 코드 구조가 깔끔해집니다.
## 스크린 (Screen)
스크린은 앱의 전체 화면을 나타내는 가장 큰 UI 단위입니다. 스크린은 다음과 같은 특징을 가집니다:
- 라우팅의 대상이 되는 단위
- 여러 뷰, 컴포넌트, 위젯으로 구성됨
- 주로 Scaffold 위젯을 사용하여 기본 구조를 정의
예를 들어, 홈 스크린, 프로필 스크린, 설정 스크린 등이 있습니다.
## 차이점 요약
1. **위젯**: UI의 가장 기본적인 구성 요소
2. **컴포넌트**: 재사용 가능한 사용자 정의 위젯의 집합
3. **뷰**: 화면의 일부분을 나타내는 더 큰 UI 구성요소
4. **스크린**: 앱의 전체 화면을 나타내는 가장 큰 UI 단위
이러한 구조로 UI를 구성하면 코드의 재사용성, 유지보수성, 가독성을 향상시킬 수 있습니다.
특히 컴포넌트화를 통해 DRY(Don't Repeat Yourself) 원칙을 적용하여 효율적인 개발이 가능합니다
// Flutter UI 위젯들을 기능과 사용 목적에 따라 그룹화
1. 기본 레이아웃 및 구조 위젯
- Scaffold
- 애플리케이션의 기본 구조를 제공하는 핵심 위젯
- 앱바(AppBar), 바디, 플로팅 액션 버튼, 드로어 등을 포함할 수 있는 기본 템플릿
- 대부분의 화면에서 기본 레이아웃과 구조를 잡을 때 사용
- 화면의 기본 배경색, 앱바, 바디 등을 쉽게 설정 가능
- Container
- 자식 위젯을 감싸고 스타일링할 수 있는 다목적 위젯
- 패딩, 여백, 배경색, 테두리, 그림자 등을 설정 가능
- 단일 위젯에 스타일과 레이아웃 속성을 적용할 때 주로 사용
- 크기 조정, 정렬, 장식 등이 가능
2. 스크롤 관련 위젯
- ListView
- 세로 또는 가로로 스크롤 가능한 목록 위젯
- 많은 수의 아이템을 효율적으로 표시
- .builder(): 동적으로 아이템 생성
- .separated(): 아이템 사이에 구분자 추가 가능
- GridView
- 격자 형태로 아이템을 배치하는 스크롤 가능한 위젯
- 2차원 레이아웃에 적합
- .count(): 고정된 개수의 열/행 생성
- .builder(): 동적으로 그리드 아이템 생성
- SingleChildScrollView
- 단일 자식 위젯을 스크롤 가능하게 만드는 위젯
- 작은 양의 콘텐츠를 스크롤할 때 사용
- 성능상 ListView나 GridView보다 무거움
3. 내비게이션 및 앱바 관련
- AppBar
- 화면 상단에 표시되는 도구 모음
- 제목, leading 아이콘, 액션 버튼 등 포함
- 앱의 현재 화면이나 컨텍스트를 사용자에게 제공
- BottomNavigationBar
- 화면 하단에 위치한 내비게이션 메뉴
- 앱의 주요 섹션 간 빠른 전환 제공
- 3-5개 정도의 주요 메뉴에 적합
4. 스타일링 및 장식 위젯
- Decoration
- Container나 BoxDecoration과 함께 사용
- 배경색, 그라데이션, 테두리, 그림자 등 시각적 효과 추가
- 위젯에 고급 스타일링 적용 가능
- BoxDecoration
- 컨테이너에 복잡한 스타일 적용
- 색상, 그라데이션, 테두리, 박스 그림자 등 설정
5. 배치 및 정렬 위젯
- Column / Row
- Column: 수직 방향으로 위젯 배치
- Row: 수평 방향으로 위젯 배치
- 자식 위젯들의 정렬과 간격 조절 가능
- Stack
- 위젯들을 겹쳐서 배치
- 복잡한 레이아웃이나 오버레이 디자인에 유용
6. 입력 및 상호작용 위젯
- TextField
- 사용자 텍스트 입력을 받는 위젯
- 다양한 스타일과 유효성 검사 옵션 제공
- GestureDetector
- 터치, 탭, 드래그 등 다양한 제스처 감지
- 위젯에 사용자 상호작용 추가
7. 특수 목적 위젯
- RefreshIndicator
- 당겨서 새로고침 기능 구현
- 목록의 데이터를 새로고침할 때 사용
'공부 일기 > TIL' 카테고리의 다른 글
Flutter 창업반 6주차 TIL5 블로그 앱 만들기-Firebase연동 (0) | 2024.12.05 |
---|---|
Flutter 창업반 6주차 TIL4-1 Firebase-블로그 앱 만들기 UI (1) | 2024.12.05 |
Flutter 창업반 6주차 TIL3-1 RiverPod-책검색 앱 만들기, 웹 개발 관련 (1) | 2024.12.04 |
Flutter 창업반 6주차 TIL2 상태 관리 패키지(RiverPod)관련 복습/실습 (0) | 2024.12.03 |
Flutter 창업반 6주차 TIL1 - Dart 언어 특수문자 사용법, 동기/비동기 특강 (1) | 2024.12.02 |