데이터 읽고 싶을 때
데이터 보내고 싶을 때
강의 상 임시 서버로 GET 요청을 날려보자
pubspec.yaml > dependencies 밑에 http: ^버전android > app > src > main > AndroidManifest.xml <application 앞에
<uses-permission android:name="android.permission.INTERNET" /> 작성
맨 위에 아래 두 줄 추가
import 'package:http/http.dart' as http;
import 'dart:convert';
initState(){} 생성await 필요async 못 붙이니까 GET 함수 따로 빼기getData() async {
var result = await http.get(
Uri.parse('서버URL'),
);
print(result.body);
}
void initState() {
super.initState();
getData();
}
print(jsonDecode(result.body));NoSuchMethodError: '[]'
Dynamic call of null.
Receiver: null
Arguments: [0]
→ data == null 또는 data.isEmpty 체크
return data == null
? CircularProgressIndicator()
: ListView.builder(
혹은
if (data.isNotEmpty) {
return ListView.builder(
// (생략)
} else {
return CircularProgressIndicator()
Assertion failed: !isDisposed
"Trying to render a disposed EngineFlutterView."
동기 작업이 완료되었을 때 위젯이 이미 dispose(unmount)된 경우
위젯이 unmount(dispose) 된 후에도 setState()가 호출되면 문제가 됨
void loadData() async {
var result = await http.get(Uri.parse('서버URL'));
setState(() { // ❗ 요때 위젯이 dispose되었을 수 있음
data = jsonDecode(result.body);
});
}
getData() async {
var result = await http.get(Uri.parse('서버URL'));
if (!mounted) return;
setState(() {
data = jsonDecode(result.body);
});
}
getData() async {
var result = await http.get(Uri.parse('서버URL'));
if (result.statusCode == 200) { 요청 성공 시 실행 코드 }
else { 실패 시 실행 코드 }
}
조금 더 짧은 코드로 GET 요청 가능한 패키지
Future()를 뱉는 애들을 넣을 수 있는데 데이터가 자꾸 추가되면 사용하기 불편함
ex) body: [FutureBuilder(future: data, builder: (){}), ...],
map 안에 map, list 안에 list 등 모든 자료형을 넣기 가능