//dependencies 밑에
http:
flutter_hooks:
provider:
go_router:
- 문자열이 날아옴
- 문자열 파싱(내가 필요한 타입으로 변경)
- jsonDecode
-> dynamic
(모든 타입으로 받을 수도 변경할 수도 있음)
=> 즉, 개발자 니가 알아서 파싱해- 리스트로 캐스팅(형변환)
- DTO 객체 생성할 때 json데이터를 넣어줌
(DTO를 편하게 쓰기 위해 factory 사용)
자바스크립트 Promise에 대응되며, Future와 Promise는 모두 싱글스레드 환경에서 비동기 처리를 위해 존재한다.
동기적으로 처리할 경우 발생하는 낭비를 막고자 비동기를 이용해서 처리한다.
- JS의 Promise는 특정 동작의 수행이 완료되면 다음 동작을 하겠다는 약속
- Dart의 Future는 지금은 없지만 미래에 요청한
데이터 혹은 에러가 담길 그릇
Dart의 비동기 처리를 위한 것으로 Future를 조금 더 용이하게 다루기 위한 키워드
1. await 키워드를 사용한 함수는 무조건 async함수이어야 한다.
2. async 함수는 무조건 Future를 반환해야 한다.
<동작방법>
1) await를 만나면 함수를 잠시 멈추고 함수를 호출한 곳에 Future를 return한다.
2) await가 붙은 동작이 완료되기 전까지 함수를 더 이상 진행하지 않는다.
3) return을 통해 1번에서 주었던 Future에서 return값이 나오게 한다.
Future<List<PostDTOTable>?> getDTOList() async{
String url = "https://jsonplaceholder.typicode.com/posts";
http.Response response = await http.get(Uri.parse(url));
if(response.statusCode==200){ //http 상태 코드. 200은 정상 진행
return PostDTOTable.fromJsonList(jsonDecode(response.body));
}else{
return null;
}
}
}
애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴
즉, 싱글톤 패턴은 '하나'의 인스턴스만 생성하여 사용하는 디자인 패턴이다. 메모리 낭비를 막기 위함이다.
//post_repository.dart
import 'dart:convert';
import 'package:flutter_http_1/post_dto.dart';
import 'package:http/http.dart' as http;
class PostRepository{
//싱글톤 - 해당 타입의 객체가 프로그램에서 단 한개만 존재
//스태틱 변수 선언
static PostRepository? _instance;
//첨에는 null이니까 ? 붙임. 지금은 인스턴스가 아니라 오브젝트 상태임
//public 생성자 제거(public 생성자가 있으면 여러개 만들수 있어서 막아야됨)
//dart에서 private는 맨 앞에 언더바(_)를 붙인다.
PostRepository._canAnyName(){
// count++;
// print(count);
} //생성자 이름은 아무거나 만들어도 상관없음 앞에다가 언더바 붙이기
// static int count = 0;
//변수 ?? 대체값
//?? 뒤에는 변수가 null일 경우 대체값으로 들어가는(리턴되는) 내용
//String str = [null일수도 있는 String]; 이면 에러나는데 String str = [null일수도 있는 String] ?? "값없음";은 가능
//String str = "값없음";
//계속 null이라서 부를때마다 새 객체가 호출됨
//--------------------------------------------------------------------
//변수 ??= 대입값
//변수가 null일 경우 변수에 대입값을 넣고 리턴한다.
//String str = [null일수도 있는 String] ??= "값이 없음";
//String str = ["값이 없음"라는 값이 들어간 null일수도 있는 String];
//위 단계에서 값이 들어가기 때문에 다음번 호출할때는 null 아님(새 객체는 한번만 생기고 다음부터는 원래 객체 불러져서 싱글톤 동작)
//싱글톤 객체 getter
static PostRepository get instance => _instance ??= PostRepository._canAnyName();
생성자를 통해서 객체를 만들려고 하는데 처리가 번거로울 경우 어떠한 타입을 받아서 DTO 클래스 내부에서 객체 생성
/ 리턴 해주기 위함
factory / get 모양은 화살표 함수랑 비슷하지만 기능, 역할은 모두 다르다.
factory PostDTOTable.fromJson(dynamic json) => PostDTOTable(
userId: json["userId"],
id: json["id"],
title: json["title"],
);
return PostDTOTable.fromJson(data);