개발이 좋아서/Flutter가 좋아서
[flutter] 미세먼지 앱_데이터 모델링
zoaseo
2023. 1. 31. 14:40
1)

2) const
/data.dart

3) model
/stat_model.dart
enum ItemCode {
// 이황산가스
SO2,
// 일산화탄소
CO,
// 오존
O3,
// 이산화질소
NO2,
// 미세먼지
PM10,
// 초미세먼지
PM25
}
class StatModel {
final double daegu;
final double chungnam;
final double incheon;
final double daejeon;
final double gyeongbuk;
final double sejong;
final double gwangju;
final double jeonbuk;
final double gangwon;
final double ulsan;
final double jeonnam;
final double seoul;
final double busan;
final double jeju;
final double chungbuk;
final double gyeongnam;
final DateTime dataTime;
final double gyeonggi;
final ItemCode itemCode;
StatModel.fromJson({required Map<String, dynamic> json})
: daegu = double.parse(json['daegu'] ?? '0'),
chungnam = double.parse(json['chungnam'] ?? '0'),
incheon = double.parse(json['incheon'] ?? '0'),
daejeon = double.parse(json['daejeon'] ?? '0'),
gyeongbuk = double.parse(json['gyeongbuk'] ?? '0'),
sejong = double.parse(json['sejong'] ?? '0'),
gwangju = double.parse(json['gwangju'] ?? '0'),
jeonbuk = double.parse(json['jeonbuk'] ?? '0'),
gangwon = double.parse(json['gangwon'] ?? '0'),
ulsan = double.parse(json['ulsan'] ?? '0'),
jeonnam = double.parse(json['jeonnam'] ?? '0'),
seoul = double.parse(json['seoul'] ?? '0'),
busan = double.parse(json['busan'] ?? '0'),
jeju = double.parse(json['jeju'] ?? '0'),
chungbuk = double.parse(json['chungbuk'] ?? '0'),
gyeongnam = double.parse(json['gyeongnam'] ?? '0'),
dataTime = DateTime.parse(json['dataTime']),
gyeonggi = double.parse(json['gyeonggi'] ?? '0'),
itemCode = parseItemCode(json['itemCode']);
static ItemCode parseItemCode(String raw) {
if (raw == 'PM2.5') {
return ItemCode.PM25;
}
return ItemCode.values.firstWhere((element) => element.name == raw);
}
}
4) repository
/stat_repository.dart
import 'package:dio/dio.dart';
import '../const/data.dart';
import '../model/stat_model.dart';
class StatRepository {
static Future<List<StatModel>> fetchData() async {
final response = await Dio().get(
'http://apis.data.go.kr/B552584/ArpltnStatsSvc/getCtprvnMesureLIst',
queryParameters: {
'serviceKey': serviceKey,
'returnType': 'json',
'numOfRows': 30,
'pageNo': 1,
'itemCode': 'PM10',
'dataGubun': 'HOUR',
'searchCondition': 'WEEK',
},
);
return response.data['response']['body']['items']
.map<StatModel>(
(item) => StatModel.fromJson(json: item),
)
.toList();
}
}
5) screen
Dio 라이브러리 사용!!!
/home_screen.dart
import 'package:dio/dio.dart';
import 'package:dusty_dust/component/card_title.dart';
import 'package:dusty_dust/component/category_card.dart';
import 'package:dusty_dust/component/hourly_card.dart';
import 'package:dusty_dust/component/main_app_bar.dart';
import 'package:dusty_dust/component/main_card.dart';
import 'package:dusty_dust/component/main_drawer.dart';
import 'package:dusty_dust/component/main_stat.dart';
import 'package:dusty_dust/const/color.dart';
import 'package:dusty_dust/const/data.dart';
import 'package:dusty_dust/model/stat_model.dart';
import 'package:dusty_dust/repository/stat_repository.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
super.initState();
fetchData();
}
fetchData() async {
final statModels = await StatRepository.fetchData();
print(statModels);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: primaryColor,
drawer: MainDrawer(),
body: CustomScrollView(
slivers: [
MainAppBar(),
SliverToBoxAdapter(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
CategoryCard(),
const SizedBox(height: 16.0),
HourlyCard(),
],
),
)
],
),
);
}
}