HTTP, Dio처럼 api을 읽어 오는 패키지들이 있는데, Dio를 이용하여, google book api를 호출했습니다.
async와 await를 이용하여, 받아오는 시간을 기다리게끔 햇습니다.
// book_service.dart
class BookService extends ChangeNotifier {
// 책 목록
List<Book> bookList = [];
/// 검색어로 책 정보 불러오기
void getBookList(String q) async {
// API 호출
Response res = await Dio().get(
"https://www.googleapis.com/books/v1/volumes?q=$q&startIndex=0&maxResults=40",
);
List items = res.data["items"]; // items 접근
for (Map<String, dynamic> item in items) {
Map<String, dynamic> volumeInfo = item["volumeInfo"]; // volumeInfo 접근
Book book = Book.fromJson(volumeInfo); // Map -> Book
bookList.add(book); // Book 추가
}
// 화면 갱신
notifyListeners();
}
void getCleanList() {
bookList.clear();
notifyListeners();
}
}
//book.dart
class Book {
String title;
String subtitle;
String thumbnail;
String previewLink;
Book({
required this.title,
// 무조건 받아와야한다라고 생각하기
required this.subtitle,
required this.thumbnail,
required this.previewLink,
});
// Map<String, dynamic>을 전달받아 Book 클래스 인스턴스를 반환하는 함수
// factory 키워드를 붙여서 생성자로 사용
factory Book.fromJson(Map<String, dynamic> volumeInfo) {
return Book(
// title이 없는 경우 빈 문자열 할당
title: volumeInfo["title"] ?? "",
// subtitle이 없는 경우 빈 문자열 할당
subtitle: volumeInfo["subtitle"] ?? "",
// imageLisks 또는 thumbnail이 없을 때 빈 이미지 추가
thumbnail: volumeInfo["imageLinks"]?["thumbnail"] ??
"https://i.ibb.co/2ypYwdr/no-photo.png",
// previewLink가 없는 경우 빈 문자열 할당
previewLink: volumeInfo["previewLink"] ?? "",
);
}
}
받아오는 부분을 main.dart에 표현하여 마무리! (Provider, Consumer 이용!)