dependencies:
http: <latest_version>
dart:convert 패키지:응답 내용을 JSON Map으로 변환
빈칸엔 받아오려는 곳의 주소
fetch 메서드를 initState() 혹은 didChangeDependencies() 메서드 안에서 호출
initState() 메서드는 딱 1번만 실행되고 절대 다시는 실행되지 않는다.
InheritedWidget의 변경에 대한 응답으로 API를 다시 로드하고 싶다면 didChangeDependencies() 메서드 안에 호출을 넣는다.
데이터를 화면에 보여주기 위한 목적으로, FutureBuilder 위젯을 사용할 수 있다. FutureBuilder 위젯은 Flutter에 기본적으로 제공되는 위젯으로 비동기 데이터 처리를 쉽게 해준다.
fetchPost()를 initState()에서 호출하는 이유?
Flutter는 무언가 변경될 때마다 build() 메서드를 호출하는데, 이 호출은 놀랄 만큼 자주 일어난다. 만약 네트워크 요청 코드를 build() 메서드에 그대로 남겨둔다면, 불필요한 API 요청이 아주 많이 발생하고 앱이 느려질 수 있다.
<script>
 
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
Future<Info> fetchInfo() async {
var url = 'https://api.mockaroo.com/api/5ee43e50?count=1&key=6213f2b0';
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
  //만약 서버가 ok응답을 반환하면, json을 파싱합니다
  print('응답했다');
  print(json.decode(response.body));
  return Info.fromJson(json.decode(response.body));
} else {
  //만약 응답이 ok가 아니면 에러를 던집니다.
  throw Exception('계좌정보를 불러오는데 실패했습니다');
}
}
class Info {
final int id;
final String userName;
final int account;
final int balance;
Info(
    {required this.id,
    required this.userName,
    required this.account,
    required this.balance});
factory Info.fromJson(Map<String, dynamic> json) {
  return Info(
    id: json["id"],
    userName: json["userName"],
    account: json["account"],
    balance: json["balance"],
  );
}
}
class InfoPage extends StatefulWidget {
const InfoPage({Key? key}) : super(key: key);
@override
State<InfoPage> createState() => _InfoPageState();
}
class _InfoPageState extends State<InfoPage> {
Future<Info>? info;
@override
void initState() {
  super.initState();
  info = fetchInfo();
}
@override
Widget build(BuildContext context) {
  return Scaffold(
      appBar: AppBar(
        title: Text('info', style: TextStyle(color: Colors.white)),
        centerTitle: true,
      ),
      body: Center(
        child: FutureBuilder<Info>(
          //통신데이터 가져오기
          future: info,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return buildColumn(snapshot);
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}에러!!");
            }
            return CircularProgressIndicator();
          },
        ),
      ));
}
Widget buildColumn(snapshot) {
  return Column(
    mainAxisAlignment: MainAxisAlignment.center,
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
      Text('고객번호:' + snapshot.data!.id.toString(),
          style: TextStyle(fontSize: 20)),
      Text('고객명:' + snapshot.data!.userName.toString(),
          style: TextStyle(fontSize: 20)),
      Text('계좌 아이디:' + snapshot.data!.account.toString(),
          style: TextStyle(fontSize: 20)),
      Text('잔액:' + snapshot.data!.balance.toString() + '원',
          style: TextStyle(fontSize: 20)),
    ],
  );
}
}
</script>
짜잔 -!🎈