본문 바로가기
Application/Flutter

[Cookbook] Internet에서 데이터 가져오기

by 비나래 2022. 8. 3.

전체 과정

1) http 패키지 추가

2) http 패키지를 통한 네트워크 요청

3) response를 Dart Object로 변경

4) Flutter로 Data 가져오기

5) Flutter에서 Data 전시

 

상세 과정

1) http 패키지 추가

-> pubspec.yaml 파일에 dependency 추가

-> main.dart 파일에 http 패키지 import

-> AndroidManifest.xml에 internet Permission 추가 (android > app > src > debug > AndroidManifest.xml)

 

2) network request

http.get() method를 통해 sample album을 가져옴.

http.Response 클래스는 성공적인 http call에 대한 data를 가지고 있음

 

3) Response를 Dart Object로 변경

-> Future<http.Response>로 작업 하는 것은 아주 어려움, 따라서, http.Response를 Dart 객체로 변경하여 사용하는 것이 나음. (JSON과 Serialization을 참고하기)

class Album {

	// init value
	factory Album.fromJson(Map<String, dynamic> json) {
    	return Album(
        	userId = json['userId'],
            id = json['id'],
            title = json['title']
        );
    }
}

 

-> http.Response를 Album으로 변경하는 방법

dart:convert 패키지를 통해 Response body를 JSON Map으로 변경하기

-> Response가 Success로 나오면, fromJson() factory method를 이용하여, JSON Map을 Album 클래스로 변경하기

-> Response가 200 이 아니라면 exception을 던지기, null을 던지면 안됨.

Future<Album> fetchAlbum() async {
	final response = await http
    	.get(Uri.parse('{주소}'));
        
	if (response.statusCode == 200) {
    	return Album.fromJson(jsonDecode(response.body));
    } else {
    	throw Exception('Failed to load album');
    }
}

 

4) 데이터 가져오기

fetchAlbum() method를 initState(), didChangeDependencies()로 가져오기

- initState( ) : 정확하게 딱 한 번 호출되고 그 이후에는 호출되지 않음

- InheritedWidget이 바뀐 이후에 API가 reloading 되는 것을 원하는 경우에는 didChangeDependencies() method에 넣기!

 

class _MyAppState extends State<MyApp> {
	late Future<Album> futureAlbum;
    
    @override
    void initState() {
    	super.initState();
        futureAlbum = fetchAlbum();
    }
}

 

5) Flutter에서 데이터 전시

FutureBuilder 사용하기, asynchronous data source에 사용하기 쉬움

 

------

FutureBuilder

1) Future 속성 정의

내가 다루고 싶은 Future


2) Builder 속성 정의

Future의 State에 따라 내가 render하고 싶은 builder를 정의, 

--------

 

* fetchAlbum()과 같이 불러오는 API method를 build에 포함시키지 않도록 하자.

Build method는 꽤 자주 불려짐. 따라서 주의해야함.

 

 

[전체 코드]

- Center > child 부분에 FutureBuilder를 넣으면, 해당 Future가 생성되었을 때, Widget에 대해서 build가 된다.

'Application > Flutter' 카테고리의 다른 글

[Flutter] Provider  (0) 2022.08.03
[Widget] FutureBuilder란?  (0) 2022.08.03
[Widget] TabBar, TabBarView  (0) 2022.07.26
[Cookbook] Background에서 JSON parsing 하는 방법  (0) 2022.07.25
[Cookbook] Authenticated Request 보내는 방법  (0) 2022.07.25