
데이터통신하여 UI 그리기(1)에 이어서 마지막으로 UI에 데이터를 나타내보자.
이제 클라이언트 앱 내에서 사용하기 편리한 형태의 객체로 데이터를 가공해야 한다. 모델 클래스 부터 만들어보자.
구글에 JSON to Dart 로 검색해보면 JSON 파일을 한번에 Dart의 클래스로 변환해주는 사이트가 정말 많다.
나는 https://javiercbk.github.io/json_to_dart/ 이 사이트를 사용한다!
class Store {
String? addr;
String? code;
String? createdAt;
double? lat;
double? lng;
String? name;
String? remainStat;
String? stockAt;
String? type;
Store(
{this.addr,
this.code,
this.createdAt,
this.lat,
this.lng,
this.name,
this.remainStat,
this.stockAt,
this.type});
Store.fromJson(Map<String, dynamic> json) {
addr = json['addr'];
code = json['code'];
createdAt = json['created_at'];
lat = json['lat'];
lng = json['lng'];
name = json['name'];
remainStat = json['remain_stat'];
stockAt = json['stock_at'];
type = json['type'];
}
}
우리가 가져올 데이터는 리스트에 담아 보여줘야한다. 따라서 store 객체로 변환하고 리스트에 담는 작업이 먼저 필요하다.
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<Store> stores =[];// stores 리스트 생성
@override
void initState() {
super.initState();
fetch();
}
Future fetch() async {
var response = await http.get(Uri.parse('http://example.com'));
final jsonResult = jsonDecode(response.body);
final jsonStores = jsonResult['stores'];
setState(() {
jsonStores.forEach((e) {
stores.add(Store.fromJson(e));
});
});
}
//ui 코드 생략
@override
Widget build(BuildContext context) {...}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('데이터통신 연습'),),
body: ListView(
children: stores.map((e) =>
ListTile(
title: Text(e.name ?? ''),
subtitle: Text(e.addr ?? ''),
trailing: Text(e.remainStat ?? 'soldout'),
)
).toList(),
)
우리가 원하는 데이터는 이제 stores 리스트에 담겨있다.
map을 통해 각 요소들을 ListTile 형태로 변환시켰다.
Store 객체의 각 필드는 e라는 형태가 되었다. 이제 e.name 처럼 효율적으로 여러 항목을 표시할 수 있게 되었다.
map 메서드의 반환 값은 Iterable이기 때문에, toList를 호출하여 List로 변환한다.
(즉, toList를 사용하지 않는다면 ListView에 바로 stores.map(...)을 전달할 수 없고, Iterable 타입이므로 List로 변환해야만 한다)