[Flutter] 27. 모두의 블로그 앱 만들기 (5) - 게시글 목록 페이지

김주희's avatar
Jun 10, 2025
[Flutter] 27. 모두의 블로그 앱 만들기 (5) - 게시글 목록 페이지

Post 객체

api 문서

notion image
 

api 문서 참고해서 Post 객체 만들기

notion image
 

통신

api 문서

notion image
 

post_repository

이전에 만들었던 user_repository의 코드를 참고해서 만들면 된다.
getList() 즉 게시글 목록보기를 위한 통신에서는 GET 방식, uri는 “/api/post”이고 queryString으로 page가 붙고 0이 default이다.

queryParameters 속성

queryParameters 속성은 Map<String, dynamic>? 타입이므로 page를 받을때 사진과 같이 map 타입으로 받아준다.
notion image
 

통신 테스트

디렉토리 구조

실제 post_repository 또한 lib 디렉토리 안의 data 디렉토리 안의 repository 디렉토리 아래에 위치하기 때문에 test 디렉토리 안에 똑같은 디렉토리 구조로 만든다.
notion image
 

post_repository_test

비동기 vs 동기

아래와 같이 코드를 작성할 경우 코드가 제대로 실행되지 않는다. 그 이유는 무엇일까?
notion image
 
PostRepository에서 작성한 getList 함수가 비동기 함수이기 때문에 main 스레드는 getList 상관없이 종료된다. 따라서 getList의 내부 작업이 완료된 뒤 종료되려면 await 와 async 처리가 필요하다.
notion image
 

accessToken

비동기 함수 처리 후 로그를 보면 ACCESS_TOKEN_INVALID라고 뜬다. 게시글 목록의 경우 로그인을 한 뒤에 볼 수 있는 페이지이므로 accessToken을 넣어주어야 한다.
notion image
 

PostVM

파일 위치

💡
컨벤션) ViewModel은 Page 옆에 만들기
 
notion image
 
FM과는 약간 다르기 때문에 GVM을 참고해서 만드는 것이 낫다!
 

창고 데이터 타입

notion image
 

창고

JSON 배열 데이터를 Dart 객체 리스트(List<Post>)로 변환

(data["posts"] as List).map((e) => Post.fromMap(e)).toList()
notion image
 

fromMap 만들기 전

notion image
 

fromMap 만든 후

notion image
 

PostListModel?

PostListModel()는 통신을 통해 가져오기 때문에 초기화가 불가능하다. 뿐만 아니라 빈 객체 만드는 것이 더 어렵기 때문에 null을 반환한다. 그리고 init 함수가 비동기 함수로서 동작하도록 return 전에 init 함수를 호출한다.
notion image
 

창고 관리자

notion image
 

PostListBody

notion image
 

PostListItem

데이터 바인딩

notion image
 

이미지

CachedNetworkImage 라이브러리

한 번 휴대폰에 다운받은 이미지는 캐싱된다. 웹에서는 안되고 앱에서는 캐싱 가능하다.
notion image
 

의존성 추가

notion image
 

사용 예1

notion image
 

사용 예2 : Content-Length를 통해서 진행 바를 만든다.

notion image
 

imgUrl

imgeUrl을 보면 호스트 주소가 없기 때문에 직접 작성해줘야 한다.
notion image
notion image
 

서버 jar 파일의 이미지 디렉토리

서버 jar 파일에는 이미지가 들어갈 수 없기 때문에 jar 파일 위치에 images 폴더와 그 안에 이미지를 추가해야 한다.
notion image
 
notion image
 
notion image
Share article

jay0628