dependencies:
http: ^0.13.4
import 'package:http/http.dart' as http;
import 'dart:convert';
<uses-permission android:name="android.permission.INTERNET" />
→ 변수에 저장해서 사용
getData() async {
var result = await http.get( Uri.parse('https://codingapple1.github.io/app/data.json') );
print( jsonDecode(result.body) )
}
⇒ 가져온 데이터는 JSON 형식
json.Decode()result[0][”age”] 하면 20이 출력됨getData() async {
var result = await http.get(
Uri.parse('https://codingapple1.github.io/app/data.json')
);
if (result.statusCode == 200) {
print( jsonDecode(result.body) );
} else {
throw Exception('실패함');
}
}
void initState() {
super.initState();
getData();
}
class _MyAppState extends State<MyApp> {
var tab = 0;
var data = [];
getData() async {
var result = await http.get(Uri.parse('https://codingapple1.github.io/app/data.json'));
var result2 = jsonDecode(result.body);
setState((){
data = result2;
})
}
(생략)
Home(data : data)
class Home extends StatelessWidget{
const Home ({Key? key, this.data})
final data;
Text(data[0]['content'])
⇒ 문제점 : 데이터 도착 전에 먼저 쓰면 에러 발생
class Home extends StatelessWidget{
const Home ({Key? key, this.data})
final data;
Widget build(BuildContext context){
if (data.isNotEmpty){
return ListView.builder(생략);
} else {
return Text('로딩중');
}
}
}
→ CircularProgressIndicator() 위젯 사용하면 로딩 중인 표시로 표현됨
→ 아니면 Dio 패키지 설치하여 사용해도 됨
→ 아니면 FutureBuilder 사용
future: 안에는 Future를 담은 state 이름을 적으면 됨
builder: (){return 어쩌구} 안의 코드는 입력한 state 데이터가 도착할 때 실행
그리고 snapshot 이라는 파라미터가 변화된 state 데이터를 의미
⇒ 도착 시 위젯을 보여줘야할 경우 FutureBuilder가 유용하지만 데이터가 자주 추가되는 경우엔 불편
FutureBuilder (
future: http.get(어쩌구),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('post에 데이터 있으면 보여줄 위젯')
}
return Text('post에 데이터 없으면 보여줄 위젯')
},
)
import 'package:flutter/material.dart';
import './style.dart' as style;
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() {
runApp(
MaterialApp(
theme: style.theme,
home: MyApp()
));
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var tab = 0; // 1. 현재 상태 저장
var list = [1, 2, 3];
var map = {'name':'john', 'age':20};
var data = [];
getData() async {
var result = await http.get(Uri.parse('https://codingapple1.github.io/app/data.json'));
var result2 = jsonDecode(result.body);
setState(() {
data = result2;
});
print(result2[0]['likes']);
}
void initState() {
super.initState();
getData();
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Instagram'),
actions: [
IconButton(
icon: Icon(Icons.add_box_outlined),
onPressed: () {},
iconSize: 30,
)
]),
body: [Home(data : data), Text('샵페이지')][tab], // 2. state에 따라 tab 보이는 상태 변경
bottomNavigationBar: BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
onTap: (i){
setState(() {
tab = i;
});
},
items: [
BottomNavigationBarItem(icon: Icon(Icons.home_outlined), label: '홈'),
BottomNavigationBarItem(icon: Icon(Icons.shopping_bag_outlined), label: '샵')
],
),
);
}
}
class Home extends StatelessWidget {
const Home({Key? key, this.data}) : super(key: key);
final data;
Widget build(BuildContext context) {
return ListView.builder(
itemCount: 3,
itemBuilder: (c, i) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.network(data[i]['image']),
Container(
constraints: BoxConstraints(maxWidth: 600),
padding: EdgeInsets.all(20),
width: double.infinity,
child: Column(
children: [
Text(data[i]['likes'].toString()),
Text(data[i]['user']),
Text(data[i]['content'])
],
),
)
],
);
}
);
}
}