1)
2) const
/color.dart
import 'package:flutter/material.dart';
const primaryColor = Color(0xFF009688);
const darkColor = Color(0xFF00675B);
const lightColor = Color(0xFF52C7B8);
/data.dart
/regions.dart
const regions = [
'서울',
'경기',
'대구',
'충남',
'인천',
'대전',
'경북',
'세종',
'광주',
'전북',
'강원',
'울산',
'전남',
'부산',
'제주',
'충북',
];
/status_level.dart
import 'package:dusty_dust/model/status_model.dart';
import 'package:flutter/material.dart';
final statusLevel = [
// 최고
StatusModel(
level: 0,
label: '최고',
primaryColor: Color(0xFF2196F3),
darkColor: Color(0xFF0069C0),
lightColor: Color(0xFF6EC6FF),
detailFontColor: Colors.black,
imagePath: 'asset/img/best.png',
comment: '우와! 100년에 한번 오는 날!',
minFineDust: 0,
minUltraFineDust: 0,
minO3: 0,
minNO2: 0,
minCO: 0,
minSO2: 0,
),
// 좋음
StatusModel(
level: 1,
label: '좋음',
primaryColor: Color(0xFF03a9f4),
darkColor: Color(0xFF007ac1),
lightColor: Color(0xFF67daff),
detailFontColor: Colors.black,
imagePath: 'asset/img/good.png',
comment: '공기가 좋아요! 외부활동 해도 좋아요!',
minFineDust: 16,
minUltraFineDust: 9,
minO3: 0.02,
minNO2: 0.02,
minCO: 1,
minSO2: 0.01,
),
// 양호
StatusModel(
level: 2,
label: '양호',
primaryColor: Color(0xFF00bcd4),
darkColor: Color(0xFF008ba3),
lightColor: Color(0xFF62efff),
detailFontColor: Colors.black,
imagePath: 'asset/img/ok.png',
comment: '공기가 좋은 날이예요!',
minFineDust: 31,
minUltraFineDust: 16,
minO3: 0.03,
minNO2: 0.03,
minCO: 2,
minSO2: 0.02,
),
// 보통
StatusModel(
level: 3,
label: '보통',
primaryColor: Color(0xFF009688),
darkColor: Color(0xFF00675b),
lightColor: Color(0xFF52c7b8),
detailFontColor: Colors.black,
imagePath: 'asset/img/mediocre.png',
comment: '나쁘지 않네요!',
minFineDust: 41,
minUltraFineDust: 21,
minO3: 0.06,
minNO2: 0.05,
minCO: 5.5,
minSO2: 0.04,
),
// 나쁨
StatusModel(
level: 4,
label: '나쁨',
primaryColor: Color(0xFFffc107),
darkColor: Color(0xFFc79100),
lightColor: Color(0xFFfff350),
detailFontColor: Colors.black,
imagePath: 'asset/img/bad.png',
comment: '공기가 안좋아요...',
minFineDust: 51,
minUltraFineDust: 26,
minO3: 0.09,
minNO2: 0.06,
minCO: 9,
minSO2: 0.05,
),
// 상당히 나쁨
StatusModel(
level: 5,
label: '상당히 나쁨',
primaryColor: Color(0xFFff9800),
darkColor: Color(0xFFc66900),
lightColor: Color(0xFFffc947),
detailFontColor: Colors.black,
imagePath: 'asset/img/very_bad.png',
comment: '공기가 나빠요! 외부활동을 자제해주세요!',
minFineDust: 76,
minUltraFineDust: 38,
minO3: 0.12,
minNO2: 0.13,
minCO: 12,
minSO2: 0.1,
),
// 매우 나쁨
StatusModel(
level: 6,
label: '매우 나쁨',
primaryColor: Color(0xFFf44336),
darkColor: Color(0xFFba000d),
lightColor: Color(0xFFff7961),
detailFontColor: Colors.black,
imagePath: 'asset/img/worse.png',
comment: '매우 안좋아요! 나가지 마세요!',
minFineDust: 101,
minUltraFineDust: 51,
minO3: 0.15,
minNO2: 0.2,
minCO: 15,
minSO2: 0.15,
),
// 최악
StatusModel(
level: 7,
label: '최악',
primaryColor: Color(0xFF212121),
darkColor: Color(0xFF000000),
lightColor: Color(0xFF484848),
detailFontColor: Colors.white,
imagePath: 'asset/img/worst.png',
comment: '역대급 최악의 날! 집에만 계세요!',
minFineDust: 151,
minUltraFineDust: 76,
minO3: 0.38,
minNO2: 1.1,
minCO: 32,
minSO2: 0.16,
)
];
3) model
/stat_and_status_model.dart
import 'package:dusty_dust/model/stat_model.dart';
import 'package:dusty_dust/model/status_model.dart';
class StatAndStatusModel {
final StatModel stat;
final StatusModel status;
final ItemCode itemCode;
StatAndStatusModel({
required this.stat,
required this.status,
required this.itemCode,
});
}
/stat_model.dart
import 'package:hive_flutter/hive_flutter.dart';
part 'stat_model.g.dart';
@HiveType(typeId: 2)
enum ItemCode {
// 미세먼지
@HiveField(0)
PM10,
// 초미세먼지
@HiveField(1)
PM25,
// 일산화탄소
@HiveField(2)
CO,
// 오존
@HiveField(3)
O3,
// 이산화질소
@HiveField(4)
NO2,
// 이황산가스
@HiveField(5)
SO2,
}
@HiveType(typeId: 1)
class StatModel {
@HiveField(0)
final double daegu;
@HiveField(1)
final double chungnam;
@HiveField(2)
final double incheon;
@HiveField(3)
final double daejeon;
@HiveField(4)
final double gyeongbuk;
@HiveField(5)
final double sejong;
@HiveField(6)
final double gwangju;
@HiveField(7)
final double jeonbuk;
@HiveField(8)
final double gangwon;
@HiveField(9)
final double ulsan;
@HiveField(10)
final double jeonnam;
@HiveField(11)
final double seoul;
@HiveField(12)
final double busan;
@HiveField(13)
final double jeju;
@HiveField(14)
final double chungbuk;
@HiveField(15)
final double gyeongnam;
@HiveField(16)
final DateTime dataTime;
@HiveField(17)
final double gyeonggi;
@HiveField(18)
final ItemCode itemCode;
StatModel({
required this.daegu,
required this.chungnam,
required this.incheon,
required this.daejeon,
required this.gyeongbuk,
required this.sejong,
required this.gwangju,
required this.jeonbuk,
required this.gangwon,
required this.ulsan,
required this.jeonnam,
required this.seoul,
required this.busan,
required this.jeju,
required this.chungbuk,
required this.gyeongnam,
required this.dataTime,
required this.gyeonggi,
required this.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);
}
double getLevelFromRegion(String region) {
if (region == '서울') {
return seoul;
} else if (region == '경기') {
return gyeonggi;
} else if (region == '대구') {
return daegu;
} else if (region == '충남') {
return chungnam;
} else if (region == '인천') {
return incheon;
} else if (region == '대전') {
return daejeon;
} else if (region == '경북') {
return gyeongbuk;
} else if (region == '세종') {
return sejong;
} else if (region == '광주') {
return gwangju;
} else if (region == '전북') {
return jeonbuk;
} else if (region == '강원') {
return gangwon;
} else if (region == '울산') {
return ulsan;
} else if (region == '전남') {
return jeonnam;
} else if (region == '부산') {
return busan;
} else if (region == '제주') {
return jeju;
} else if (region == '충북') {
return chungbuk;
} else if (region == '경남') {
return gyeongnam;
} else {
return throw Exception('알 수 없는 지역입니다.');
}
}
}
/stat_model.g.dart
-- flutter pub run build_runner build
/status_model.dart
import 'package:flutter/material.dart';
class StatusModel {
// 단계
final int level;
// 단계 이름
final String label;
// 주 색상
final Color primaryColor;
// 어두운 색상
final Color darkColor;
// 밝은 색상
final Color lightColor;
// 폰트 색상
final Color detailFontColor;
// 이모티콘 이미지
final String imagePath;
// 코멘트
final String comment;
// 미세먼지 최소치
final double minFineDust;
// 초미세먼지 최소치
final double minUltraFineDust;
// 오존 최소치
final double minO3;
// 이산화질소 최소치
final double minNO2;
// 일산화탄소 최소치
final double minCO;
// 이황산가스 최소치
final double minSO2;
StatusModel({
required this.level,
required this.label,
required this.primaryColor,
required this.darkColor,
required this.lightColor,
required this.detailFontColor,
required this.imagePath,
required this.comment,
required this.minFineDust,
required this.minUltraFineDust,
required this.minO3,
required this.minNO2,
required this.minCO,
required this.minSO2,
});
}
'개발이 좋아서 > Flutter가 좋아서' 카테고리의 다른 글
[flutter] 미세먼지 앱_마무리_UI (0) | 2023.02.07 |
---|---|
[flutter] 미세먼지 앱_마무리_repository, screen, utils, main (0) | 2023.02.07 |
[flutter] 미세먼지 앱_최종 마무리_component, container (0) | 2023.02.07 |
[flutter] 미세먼지 앱_Hive_연습 (0) | 2023.02.06 |
[flutter] 미세먼지 앱_데이터 모델링 (0) | 2023.01.31 |