-
12일교육/9주완성!프로젝트캠프-플러터 2023. 10. 22. 11:49728x90
67강. 생활 Widget
Widgets
- stack
- 위젯을 쌓고 싶을 때 사용, Positioned 위젯과 함께 사용
- Divider
- 구분선을 넣고 싶을 때 사용
- AnimatedOpacity
- (불투명도 애니메이션)Opacity 값을 바꿔주면 사이값을 자동으로 애니메이션 효과 적용
- AnimatedContainer
- 캐치되는 속성값을 감지하는 애니메이션
- AspectRatio
- 자식 위젯의 사이즈 비율을 정확히 맞춰야 할 때(보통 비디오를 넣어야할 때 4:3, 정사각형을 보여줄 때 1:1)
- Wrap
- Row는 화면에 벗어나면 안되지만, Wrap은 다음 줄로 넘어가도록 하게 함
Packages
- url_launcher
- 전화걸기, 메세지보내기, 특정 URL웹으로 이동, (카카오톡 채널로 이동)
- cahed_network_image
- 이미지를 캐싱할 수 있도록 함
- intl
- 화폐표시, 시간 표시
68강. shared_preferences
데이터를 어디에 둘 것인가?(로컬 vs 서버)
앱 내에서 데이터를 잠깐 저장해야할 때가 있음, 어플은 꺼지면 내용이 초기화됨
앱 내에서 데이터를 저장할 수 있는 경우 저장해주는 것이 좋음(앱 내에서도 사용될 중요하지 않은 가벼운 데이터)
어떠한 데이터들이 앱 내에 저장되어야할까?
로컬기반 어플, 자동로그인, 장바구니, 동영상 시청기록
앱을 종료해도 불러와서 사용할 수 있는 데이터
앱 내에 저장하는 데이터, 흔히 앱 데이터 라고 하며 언제든 저장하고 불러와서 사용 가능
기본 순서는 아래와 같음
- 앱 데이터 접근 "객체" 초기화
- 내용 저장
- 내용 불러오기
앱 내 데이터를 구현하는 패키지를 이용하면 구현 가능
69강. 키오스크 앱 업그레이드 - 2
생략
70강. class
객체지향의 꽃class는 제작서(레시피), 건물로 치면 설계도
내가 만들고 싶은 게 무엇인지 정의
클래스(제작서)를 통해 생성된 결과물이 객체(Object) or 인스턴스(instance)라고 불림
하나의 클래스로 여러 개의 결과물을 만들 수 있음
71강. constructor
클래스는 크게 3개로 나뉨
- 멤버변수
- (클래스)객체 내에서 사용할 수 있는 변수들
- 멤버함수
- (클래스)객체 내에서 사용할 수 있는 함수들
- 생성자
- 객체를 생성할 수 있는 생성함수
클래스 생성자(Constructor)
객체를 생성해주는 핵심 함수이며, 생성자 함수라고 불리움
생성자가 없으면 객체를 생성해서 변수에 넣어주지 못함
클래스명을 넣고 필수 멤버 변수를 괄호 안에 다 넣어주면 됨
//방식1.이름없는 생성자(Unnamed constructor) class User{ //멤버 변수 final name; //생성자 함수 User(this.name); } void main(){ var user1=User("teddy"); var user2=User("Zzang-yeah"); } //방식2.이름있는 생성자(Named constructor) class User{ //멤버 변수 String name; //생성자 함수 User.withName(String inputName) : name=inputName; } void main(){ var user1=User.withName("teddy"); var user2=User.withName("Zzang-yeah"); }
속성값도 명확히 나타내고 싶다면?
=>선택 매개변수
curly bracket({})로 감싼다
class User{ //멤버 변수 String name; //생성자 함수 User.withName({required this.name}); } void main(){ var user1=User.withName(name:"teddy"); var user2=User.withName(name:"Zzang-yeah"); }
이 때, 주의할 점은 name은 선택 매개변수이기때문에 무조건 값이 들어와야한다는 의미인 required키워드를 사용
why?name에는 String이 들어와야하는데 "선택"을 안 하고 매개변수를 입력하지 않으면 곧 NULL이기 때문
플러터에서 required의 값이 의미하는 바가 아래와 같음
Dart : 소중한 매개변수들을 선택해서 넣겠다고?그러면 필수 키워드라도 붙여주셈 null값은 노인정
생성자의 역할
객체를 생성할 수 있음
객체를 생성할 때 class에 정의해둔 레시피대로 만들어야 하기 때문에, 변수를 다 채워야함
- this.의 뜻은 나중에 변수명이 들어갈 공간이라고 생각
- var friend1=Human(...);라고 코드를 작성했을 떄, this.가 곧 friend1이 되기 위해 this라는 키워드가 붙음
class Human{ //멤버 변수 String name; double height; int cash; int age; Human? girlfriend; Human? boyfriend; List<human>? friends; //생성자 함수 Human(this.name, this.heigth, this.cash, this.age, this.girlfriend, this.friends); }
72강. Dart: Method, Flutter에서의 활용
멤버 함수(메소드)
이 클래스로 만든 객체들이 사용할 수 있는 능력들(함수들)
eat(String foodName){ print("파오후파오후 $foodName주세요 현기증 난단말이예요"); weight+=1; } workout(int hours){ print("하기싫다 하지만 돈벌어야지,,,$hours만 빡집중해야지"); weigth-=0.1; } getMoney(int amount){ cash+=amount; } spendMoney(int amount){ cash-=amount; }
클래스 멤버 함수(메소드)
class Human { //멤버 변수 String name; double weight; int cash; int age; Human? girlfriend; List<Human>? friends; //생성자 함수 Human(this.name, this.weight, this.cash, this.age, this.girlfriend, this.friends); //멤버 함수(메서드) eat(String foodName){ print("파오후파오후 $foodName주세요 현기증 난단말이예요"); weight+=1; } workout(int hours){ print("하기싫다 하지만 돈벌어야지,,,$hours만 빡집중해야지"); weigth-=0.1; } getMoney(int amount){ cash+=amount; } spendMoney(int amount){ cash-=amount; } }
class User{ String userId; String profileImage; String nickname; DateTime vreated; DateTime updated; DateTime visited; List<User> followers; List<User> followings; List<User> blocked; List<Feed> feeds; User(this.userId, this.profileImage, this.nickname, this.created, this.updated, this.visited, this.followers, this.followings, this.blocked, this.feeds); Future<bool> addFollwer(User follower) async { var res=await dio.get("팔로워 넣기 url", {"userId":follwer.userId}); if (res.status == 200){ followers.add(follower); return true; } } }
Flutter 73강. fromMap, toMap
생성자를 통한 객체 생성
//클래스 정의 class Word{ String word; String meaning; String example; } //생성자 추가 Word){required this.word, required this.meaning, required this.example}) //객체 생성 void main(){ var word = Word(word:"Apple",meaning:"사과",example:"애플로고") }
매번 이렇게 넣어주긴 힘듦
네트워크의 데이터는 JSON타입
Dart에는 JSON타입과 비슷한 MAP데이터타입이 있음
내가 입력하지 않고도 Map자체를 전달하면 객체를 생성해주면??
Map<String, dynamic> word={ "word":"Apple", "meaning":"사과", "example":"애플덕후인 것을 보니 사과농사를 잘 짓겠구나", };
//생성자 하나 더 추가(이름있는 생성자, fromMap) Word.fromMap(Map<String, dynamic> map): word=map["word"], meaning=map["meaning"], example=map["example"];
//fromMap을 통한 객체 생성 void main() { Map<String, dynamic> word={ "word":"Apple", "meaning":"사과", "example":"애플제품이 많은 걸 보니 사과농사를 짓고 있구나", }; }
반대로 toMap은
서버에다가 해당 객체내용을 보내야할 때 주로 사용(백엔드 스펙에 따라 다름)
Map을 배출해주는(toMap) 멤버 함수 추가
Map<String, dynamic> toMap() =>{ "word":word, "meaning":meaning, "example":example, };
Flutter 74강. toString,override
Flutter는 모든 게 다 위젯이다
Dart에서는 모든 것이 Object로 다뤄진다
@override:기존의 (부모)기능을 새로 재정의한다
본 후기는 유데미-스나이퍼팩토리 9주 완성 프로젝트캠프 학습 일지 후기로 작성 되었습니다.
- stack