기상청 API 또는 날씨 API라고 검색하면 금방 찾을 수 있음
💡 위 코드들에 대한 설명입니다.
likedBookList.map((book) => book.id):
>> likedBookList 의 요소들을 순회하며 id 들만 뽑아 새로 iterable(List와 비슷) 을 만듭니다.
likedBookList.removeWhere((book) => book.id == bookId):
>> toggleLikeBook 함수가 인자로 받는 book 과 id 가 같은 Book 이 likedBookList 내에 있다면 제거합니다.
notifyListeners: 화면을 새로고침합니다.
💡 왜
**likedBookList.contains(book)** 과 같이 작성하지 않을까요?
- 클래스를 통해 생성된 두개의 객체는 처음에 대입해주는 값들(Book 에서는 title, subtitle 등)이 같더라도, 서로 다른 존재입니다.
- 코드로 작성해보면 아래와 같습니다.
우리가 작성한 코드에서도 똑같은 일이 일어납니다. 서로 다른 객체로 인식하기 때문에 contains 는 항상 false 를 반환할 수밖에 없습니다.var book1 = Book(id: "1", title: "톰 소여의 모험"); var book2 = Book(id: "1", title: "톰 소여의 모험"); print(book1 == book2) // falsevar likedBookList = [Book(id: "1", title: "톰 소여의 모험")]; var book2 = Book(id: "1", title: "톰 소여의 모험"); print(likedBookList.contains(book2)) // false- 이를 해결하기 위해서
==연산자를 덮어씌워 비교 로직을 새로 작성하거나,Equatable등의 플러그인 등을 사용하기도 합니다. 핵심은 두개의 객체가 같은 데이터를 가리키고 있는지를 어떤 식으로 알아낼 것이냐는 점입니다.
우리는 Google Book API 가 제공하는 id (고유한 값입니다) 를 이용해서 비교 로직을 작성했습니다.
**likedBookList.map((book) => book.id)**와 같이 id 들이 담긴 iterable(리스트와 유사합니다) 를 만들고, 이것이 우리가 좋아요 버튼을 누른 Book 의 id 를 포함하는지 비교해, 이미 좋아요가 눌린 책인지 아닌지를 구분할 수 있겠죠!
💡 WebView란 앱 내에서 웹브라우저 컴포넌트를 사용해 웹페이지를 띄우는 것을 말합니다.
즉, 앱 내에 웹 브라우저를 넣는 것이라 생각하시면 됩니다.
Map toJson() {//Json형태로 저장
return {
"id": id,
"title": title,
"subtitle": subtitle,
"authors": authors,
"publishedDate": publishedDate,
"thumbnail": thumbnail,
"previewLink": previewLink,
};
}
factory Book.fromJson(json) { //Json 형태로 불러옴
return Book(
id: json['id'],
title: json['title'],
subtitle: json['subtitle'],
authors: json['authors'],
publishedDate: json['publishedDate'],
thumbnail: json['thumbnail'],
previewLink: json['previewLink'],
);
}
여기서
factory....? 이녀석 뭐지,,,??
>> 검색 해보니factory pattern이란 녀석이 나옴, 또 검색하니 아래 같이 설명 함
- 디자인 패턴 중 하나인 Factory 패턴은 객체를 생성하기 위해 인터페이스를 생성하고 인터페이스를 사용하는 클래스에서 어떤 객체를 만들지를 결정하게 하는 패턴이라고 한다.
- 팩토리 패턴은 싱글톤 패턴이다.
싱글톤 패턴은 생성자를 여러번 호출해도 결국 초기에 만들어진 하나의 생성자만 사용하는 것이다.
factory 는 싱글톤 패턴을 사용할 때 쓰는 예약어 이다.- 사용하는 이유는 static을 사용한 효과가 나 객체를 생성하지 않고도 이 패턴을 사용할 수 있고, 내부가 변경되어도 모델 생성을 관여하지 않기 때문에 수정을 최소화 할 수 있다.
> 나: 뭔...말이지? 🤔 일단 예제 보고 파악 해보자...
여러번Class불러서 처리하는 것을 한번 불러서 처리하는...? 뭐 그런식으로 이해하고 넘어감...