고원빈

[frontend] 2021-05-19

...@@ -55,3 +55,7 @@ appbar 관련 디자인은 추후 구현 예정 ...@@ -55,3 +55,7 @@ appbar 관련 디자인은 추후 구현 예정
55 + server test 완료 55 + server test 완료
56 ### 2021-05-18 56 ### 2021-05-18
57 + 회원 가입 SERVER 연동 57 + 회원 가입 SERVER 연동
58 +### 2021-05-19
59 ++ Login 연동
60 ++ 약병 등록 ,허브 등록 구현
61 +
......
1 -SERVER_URL=포트 주소
...\ No newline at end of file ...\ No newline at end of file
1 +SERVER_URL=
...\ No newline at end of file ...\ No newline at end of file
......
1 import 'package:flutter/material.dart'; 1 import 'package:flutter/material.dart';
2 import 'package:Smart_Medicine_Box/src/screens/SettingPage.dart'; 2 import 'package:Smart_Medicine_Box/src/screens/SettingPage.dart';
3 +import 'dart:convert';
4 +import 'package:shared_preferences/shared_preferences.dart';
5 +import 'package:http/http.dart' as http;
6 +import 'package:flutter_dotenv/flutter_dotenv.dart';
3 7
4 class DashBoard extends StatefulWidget { 8 class DashBoard extends StatefulWidget {
5 int pageNumber = 1; 9 int pageNumber = 1;
...@@ -108,6 +112,15 @@ class _DashBoardState extends State<DashBoard> { ...@@ -108,6 +112,15 @@ class _DashBoardState extends State<DashBoard> {
108 } 112 }
109 113
110 Widget mainpage(BuildContext context) { 114 Widget mainpage(BuildContext context) {
115 + Future<String> getHubList() async {
116 + SharedPreferences prefs = await SharedPreferences.getInstance();
117 +
118 + http.Response response =
119 + await http.get(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'));
120 +
121 + print(response.statusCode);
122 + }
123 +
111 final Size size = MediaQuery.of(context).size; 124 final Size size = MediaQuery.of(context).size;
112 /* 125 /*
113 Main 화면 126 Main 화면
...@@ -191,6 +204,27 @@ Widget mainpage(BuildContext context) { ...@@ -191,6 +204,27 @@ Widget mainpage(BuildContext context) {
191 ], 204 ],
192 ), 205 ),
193 ), 206 ),
207 + Container(
208 + height: 80,
209 + padding: const EdgeInsets.fromLTRB(20, 20, 20, 20),
210 + child: RaisedButton(
211 + onPressed: () async {
212 + String saveMessage = await getHubList();
213 + },
214 + shape: RoundedRectangleBorder(
215 + borderRadius: new BorderRadius.circular(18.0),
216 + side: BorderSide(color: Colors.blue)),
217 + color: Color(0xff1674f6),
218 + child: Text(
219 + '회원 가입',
220 + textScaleFactor: 1.0,
221 + style: TextStyle(
222 + fontSize: 16,
223 + color: Colors.white,
224 + fontWeight: FontWeight.bold),
225 + ),
226 + ),
227 + )
194 ], 228 ],
195 ), 229 ),
196 ), 230 ),
......
1 -import 'package:flutter/material.dart';
2 -import 'package:flutter/services.dart';
3 -import '../shared/colors.dart';
4 -import 'package:flutter_screenutil/flutter_screenutil.dart';
5 -
6 -class MainPage extends StatefulWidget {
7 - @override
8 - _MainPageState createState() => _MainPageState();
9 -}
10 -
11 -class _MainPageState extends State<MainPage> {
12 - Widget build(BuildContext context) {
13 - return MaterialApp(
14 - title: 'Welcome to Flutter',
15 - home: Scaffold(
16 - appBar: AppBar(
17 - title: Text('Welcome to Flutter'),
18 - ),
19 - body: Center(
20 - child: Text('Main PAge 작업 영역'),
21 - ),
22 - ),
23 - );
24 - }
25 -}
1 +import 'package:Smart_Medicine_Box/src/screens/DashBoard.dart';
2 +import 'package:flutter/cupertino.dart';
3 +import 'dart:convert';
4 +import 'package:flutter/material.dart';
5 +import 'package:http/http.dart' as http;
6 +import 'package:flutter_dotenv/flutter_dotenv.dart';
7 +
8 +class RegsiterBottle extends StatefulWidget {
9 + final String hubid;
10 + RegsiterBottle({Key key, this.hubid}) : super(key: key);
11 + @override
12 + _RegsiterBottleState createState() => _RegsiterBottleState();
13 +}
14 +
15 +class _RegsiterBottleState extends State<RegsiterBottle> {
16 + final medicineBottleIDController = TextEditingController();
17 + final medicineHubIDController = TextEditingController();
18 + final medicineHubPortController = TextEditingController();
19 + final medicineHubHostController = TextEditingController();
20 +
21 + Future<String> registerhub_Validate() async {
22 + http.Response bottleresponse = await http.post(
23 + Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'bottle'),
24 + headers: {"Content-Type": "application/json"},
25 + body: jsonEncode({
26 + 'bottleId': medicineBottleIDController.text,
27 + 'hubId': widget.hubid
28 + }));
29 +
30 + if (bottleresponse.statusCode == 201) {
31 + return "등록 완료";
32 + } else if (bottleresponse.statusCode == 404) {
33 + return "Hub 없음";
34 + } else if (bottleresponse.statusCode == 403) {
35 + return "유저 정보 없음 ";
36 + } else if (bottleresponse.statusCode == 404) {
37 + return "HOST 없음";
38 + } else {
39 + return "오류";
40 + }
41 + }
42 +
43 + Widget build(BuildContext context) {
44 + final Size size = MediaQuery.of(context).size;
45 + // int goals = 60;
46 + // int points = 75;
47 +
48 + return Scaffold(
49 + backgroundColor: Colors.white,
50 + body: ListView(
51 + children: <Widget>[
52 + Padding(
53 + padding: const EdgeInsets.fromLTRB(20, 25, 20, 0),
54 + child: Row(
55 + children: <Widget>[
56 + Text(
57 + '약병 등록',
58 + textScaleFactor: 1.0,
59 + style: TextStyle(fontSize: 34),
60 + )
61 + ],
62 + ),
63 + ),
64 + Padding(
65 + padding: const EdgeInsets.fromLTRB(20, 10, 20, 0),
66 + child: Row(
67 + children: <Widget>[
68 + Text(
69 + 'SmartMedicine 회원가입',
70 + textScaleFactor: 1.0,
71 + style: TextStyle(fontSize: 16),
72 + )
73 + ],
74 + ),
75 + ),
76 + MediaQuery(
77 + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
78 + child: Container(
79 + height: size.height * 0.6,
80 + child: Padding(
81 + padding: const EdgeInsets.fromLTRB(20, 5, 20, 20),
82 + child: new Column(
83 + mainAxisAlignment: MainAxisAlignment.center,
84 + children: <Widget>[
85 + TextFormField(
86 + keyboardType: TextInputType.text,
87 + controller: medicineBottleIDController,
88 + decoration: InputDecoration(
89 + labelText: '약병 ID',
90 + helperText: '현재 사용하시는 약병의 고유번호를 입력하세요',
91 + ),
92 + ),
93 + ],
94 + ),
95 + ),
96 + ),
97 + ),
98 + Container(
99 + height: 80,
100 + padding: const EdgeInsets.fromLTRB(20, 20, 20, 20),
101 + child: RaisedButton(
102 + onPressed: () async {
103 + String saveMessage = await registerhub_Validate();
104 + print(saveMessage);
105 + if (saveMessage == "등록 완료") {
106 + showDialog(
107 + context: context,
108 + builder: (BuildContext context) {
109 + return AlertDialog(
110 + title: new Text('약병 등록'),
111 + content: new Text('약병 등록이 완료 되었습니다.'),
112 + actions: <Widget>[
113 + new FlatButton(
114 + child: new Text('Close'),
115 + onPressed: () {
116 + Navigator.push(
117 + context,
118 + MaterialPageRoute(
119 + builder: (BuildContext context) =>
120 + DashBoard(
121 + pageNumber: 1,
122 + )));
123 + })
124 + ],
125 + );
126 + });
127 + } else {
128 + showDialog(
129 + context: context,
130 + builder: (BuildContext context) {
131 + return AlertDialog(
132 + title: new Text('약병 등록'),
133 + content: new Text(saveMessage),
134 + actions: <Widget>[
135 + new FlatButton(
136 + child: new Text('Close'),
137 + onPressed: () {
138 + Navigator.push(
139 + context,
140 + MaterialPageRoute(
141 + builder: (BuildContext context) =>
142 + DashBoard(
143 + pageNumber: 1,
144 + )));
145 + })
146 + ],
147 + );
148 + });
149 + }
150 + },
151 + shape: RoundedRectangleBorder(
152 + borderRadius: new BorderRadius.circular(18.0),
153 + side: BorderSide(color: Colors.blue)),
154 + color: Color(0xff1674f6),
155 + child: Text(
156 + '약병 등록',
157 + textScaleFactor: 1.0,
158 + style: TextStyle(
159 + fontSize: 16,
160 + color: Colors.white,
161 + fontWeight: FontWeight.bold),
162 + ),
163 + ),
164 + )
165 + ],
166 + ),
167 + bottomNavigationBar: BottomAppBar(
168 + elevation: 0,
169 + child: Container(
170 + height: 70,
171 + child: Column(
172 + mainAxisAlignment: MainAxisAlignment.start,
173 + children: <Widget>[
174 + Padding(
175 + padding: const EdgeInsets.fromLTRB(70, 0, 70, 0),
176 + child: Text(
177 + '회원 가입시, 이용 약관 및 개인정보 처리 방침에 동의하는 것으로 간주합니다..',
178 + style: TextStyle(fontSize: 12, color: Color(0xff747474)),
179 + textAlign: TextAlign.center,
180 + ),
181 + )
182 + ],
183 + ),
184 + ),
185 + ),
186 + );
187 + }
188 +}
1 +import 'package:flutter/cupertino.dart';
2 +import 'dart:convert';
3 +import 'package:flutter/material.dart';
4 +import 'package:http/http.dart' as http;
5 +import 'package:flutter_dotenv/flutter_dotenv.dart';
6 +
7 +import 'RegisterBottle.dart';
8 +
9 +class RegsiterHub extends StatefulWidget {
10 + @override
11 + _RegsiterHubState createState() => _RegsiterHubState();
12 +}
13 +
14 +class _RegsiterHubState extends State<RegsiterHub> {
15 + final medicineBottleIDController = TextEditingController();
16 + final medicineHubIDController = TextEditingController();
17 + final medicineHubPortController = TextEditingController();
18 + final medicineHubHostController = TextEditingController();
19 +
20 + Future<String> registerhub_Validate() async {
21 + http.Response hubresponse =
22 + await http.post(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'),
23 + headers: {"Content-Type": "application/json"},
24 + body: jsonEncode({
25 + 'hubId': medicineHubIDController.text,
26 + 'host': medicineHubHostController.text,
27 + 'port': medicineHubPortController.text,
28 + }));
29 +
30 + if (hubresponse.statusCode == 201) {
31 + return "허브 등록 완료";
32 + } else if (hubresponse.statusCode == 409) {
33 + return "이미 존재하는 hub";
34 + } else {
35 + return "오류";
36 + }
37 + }
38 +
39 + Widget build(BuildContext context) {
40 + final Size size = MediaQuery.of(context).size;
41 + // int goals = 60;
42 + // int points = 75;
43 +
44 + return Scaffold(
45 + backgroundColor: Colors.white,
46 + body: ListView(
47 + children: <Widget>[
48 + Padding(
49 + padding: const EdgeInsets.fromLTRB(20, 25, 20, 0),
50 + child: Row(
51 + children: <Widget>[
52 + Text(
53 + '약병 등록',
54 + textScaleFactor: 1.0,
55 + style: TextStyle(fontSize: 34),
56 + )
57 + ],
58 + ),
59 + ),
60 + Padding(
61 + padding: const EdgeInsets.fromLTRB(20, 10, 20, 0),
62 + child: Row(
63 + children: <Widget>[
64 + Text(
65 + 'SmartMedicine 회원가입',
66 + textScaleFactor: 1.0,
67 + style: TextStyle(fontSize: 16),
68 + )
69 + ],
70 + ),
71 + ),
72 + MediaQuery(
73 + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
74 + child: Container(
75 + height: size.height * 0.6,
76 + child: Padding(
77 + padding: const EdgeInsets.fromLTRB(20, 5, 20, 20),
78 + child: new Column(
79 + mainAxisAlignment: MainAxisAlignment.center,
80 + children: <Widget>[
81 + TextFormField(
82 + keyboardType: TextInputType.text,
83 + controller: medicineHubIDController,
84 + decoration: InputDecoration(
85 + labelText: '허브 ID',
86 + helperText: '현자 등록하시는 허브의 고유 번호를 입력하세요',
87 + ),
88 + ),
89 + TextFormField(
90 + keyboardType: TextInputType.text,
91 + controller: medicineHubHostController,
92 + decoration: InputDecoration(
93 + labelText: 'Host',
94 + helperText: '현재 사용하시는 허브의 HOST를 입력하세요',
95 + ),
96 + ),
97 + TextFormField(
98 + keyboardType: TextInputType.text,
99 + controller: medicineHubPortController,
100 + decoration: InputDecoration(
101 + labelText: 'Port',
102 + helperText: '현재 사용하시는 허브의 PORT를 입력하세요',
103 + ),
104 + ),
105 + ],
106 + ),
107 + ),
108 + ),
109 + ),
110 + Container(
111 + height: 80,
112 + padding: const EdgeInsets.fromLTRB(20, 20, 20, 20),
113 + child: RaisedButton(
114 + onPressed: () async {
115 + String saveMessage = await registerhub_Validate();
116 + print(saveMessage);
117 + if (saveMessage == "허브 등록 완료") {
118 + Navigator.push(
119 + context,
120 + MaterialPageRoute(
121 + builder: (BuildContext context) =>
122 + RegsiterBottle(hubid: medicineHubIDController.text),
123 + ));
124 + }
125 + },
126 + shape: RoundedRectangleBorder(
127 + borderRadius: new BorderRadius.circular(18.0),
128 + side: BorderSide(color: Colors.blue)),
129 + color: Color(0xff1674f6),
130 + child: Text(
131 + ' 허브 등록 ',
132 + textScaleFactor: 1.0,
133 + style: TextStyle(
134 + fontSize: 16,
135 + color: Colors.white,
136 + fontWeight: FontWeight.bold),
137 + ),
138 + ),
139 + )
140 + ],
141 + ),
142 + bottomNavigationBar: BottomAppBar(
143 + elevation: 0,
144 + child: Container(
145 + height: 70,
146 + child: Column(
147 + mainAxisAlignment: MainAxisAlignment.start,
148 + children: <Widget>[
149 + Padding(
150 + padding: const EdgeInsets.fromLTRB(70, 0, 70, 0),
151 + child: Text(
152 + '회원 가입시, 이용 약관 및 개인정보 처리 방침에 동의하는 것으로 간주합니다..',
153 + style: TextStyle(fontSize: 12, color: Color(0xff747474)),
154 + textAlign: TextAlign.center,
155 + ),
156 + )
157 + ],
158 + ),
159 + ),
160 + ),
161 + );
162 + }
163 +}
1 +import 'dart:convert';
1 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
2 import 'package:flutter/services.dart'; 3 import 'package:flutter/services.dart';
4 +import 'package:http/http.dart' as http;
5 +import 'package:flutter_dotenv/flutter_dotenv.dart';
6 +import 'package:shared_preferences/shared_preferences.dart';
3 import './DashBoard.dart'; 7 import './DashBoard.dart';
8 +import 'RegsiterHub.dart';
4 9
5 class SignInPage extends StatefulWidget { 10 class SignInPage extends StatefulWidget {
6 @override 11 @override
...@@ -15,6 +20,40 @@ class _SignInPageState extends State<SignInPage> { ...@@ -15,6 +20,40 @@ class _SignInPageState extends State<SignInPage> {
15 final emailController = TextEditingController(); 20 final emailController = TextEditingController();
16 final passwordController = TextEditingController(); 21 final passwordController = TextEditingController();
17 22
23 + //Login 함수
24 + Future<String> login(String _email, String _password) async {
25 + http.Response response = await http.post(
26 + Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'auth/login'),
27 + headers: {"Content-Type": "application/json"},
28 + body: jsonEncode({
29 + 'userId': _email,
30 + 'password': _password,
31 + }));
32 +
33 + if (response.statusCode == 200) {
34 + return "로그인 성공";
35 + } else if (response.statusCode == 400) {
36 + return "올바르지 않은 아이디 및 패스워드";
37 + } else {
38 + return "존재하지 않는 아이디 이거나 비밀번호가 불일치 합니다.";
39 + }
40 + }
41 +
42 + //Get Bottle List 함수
43 + Future<String> getHubList() async {
44 + SharedPreferences prefs = await SharedPreferences.getInstance();
45 +
46 + http.Response response =
47 + await http.get(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'));
48 + if (response.statusCode == 200) {
49 + return "get완료";
50 + } else if (response.statusCode == 404) {
51 + return "Not Found";
52 + } else {
53 + return "Error";
54 + }
55 + }
56 +
18 Widget build(BuildContext context) { 57 Widget build(BuildContext context) {
19 final Size size = MediaQuery.of(context).size; 58 final Size size = MediaQuery.of(context).size;
20 final mqData = MediaQuery.of(context); 59 final mqData = MediaQuery.of(context);
...@@ -142,7 +181,9 @@ class _SignInPageState extends State<SignInPage> { ...@@ -142,7 +181,9 @@ class _SignInPageState extends State<SignInPage> {
142 fontFamily: 'Noto', 181 fontFamily: 'Noto',
143 fontWeight: FontWeight.bold)), 182 fontWeight: FontWeight.bold)),
144 onPressed: () async { 183 onPressed: () async {
145 - String saveMessage; 184 + String saveMessage = await login(
185 + emailController.text,
186 + passwordController.text);
146 if (emailController.text.isEmpty || 187 if (emailController.text.isEmpty ||
147 passwordController.text.isEmpty) { 188 passwordController.text.isEmpty) {
148 showDialog( 189 showDialog(
...@@ -163,18 +204,27 @@ class _SignInPageState extends State<SignInPage> { ...@@ -163,18 +204,27 @@ class _SignInPageState extends State<SignInPage> {
163 ); 204 );
164 }); 205 });
165 } else { 206 } else {
166 - emailController.text =
167 - emailController.text.trim();
168 - passwordController.text =
169 - passwordController.text.trim();
170 saveMessage = "로그인 성공"; 207 saveMessage = "로그인 성공";
171 if (saveMessage == "로그인 성공") { 208 if (saveMessage == "로그인 성공") {
172 - Navigator.push( 209 + var result = await getHubList();
173 - context, 210 + print(result);
174 - MaterialPageRoute( 211 + if (result == "Not Found") {
175 - builder: (BuildContext context) => 212 + Navigator.push(
176 - DashBoard(pageNumber: 1), 213 + context,
177 - )); 214 + MaterialPageRoute(
215 + builder:
216 + (BuildContext context) =>
217 + RegsiterHub(),
218 + ));
219 + } else if (result == "get완료") {
220 + Navigator.push(
221 + context,
222 + MaterialPageRoute(
223 + builder: (BuildContext
224 + context) =>
225 + DashBoard(pageNumber: 1),
226 + ));
227 + } else {}
178 } 228 }
179 } 229 }
180 }, 230 },
......
...@@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; ...@@ -3,6 +3,8 @@ import 'package:flutter/material.dart';
3 import 'package:http/http.dart' as http; 3 import 'package:http/http.dart' as http;
4 import 'package:flutter_dotenv/flutter_dotenv.dart'; 4 import 'package:flutter_dotenv/flutter_dotenv.dart';
5 5
6 +import 'Homepage.dart';
7 +
6 class SignUpLocal extends StatefulWidget { 8 class SignUpLocal extends StatefulWidget {
7 @override 9 @override
8 _SignUpLocalState createState() => _SignUpLocalState(); 10 _SignUpLocalState createState() => _SignUpLocalState();
...@@ -12,9 +14,6 @@ class _SignUpLocalState extends State<SignUpLocal> { ...@@ -12,9 +14,6 @@ class _SignUpLocalState extends State<SignUpLocal> {
12 final emailController = TextEditingController(); 14 final emailController = TextEditingController();
13 final passwordController = TextEditingController(); 15 final passwordController = TextEditingController();
14 final passwordValidController = TextEditingController(); 16 final passwordValidController = TextEditingController();
15 - final medicineNameController = TextEditingController();
16 - final medicineFactureController = TextEditingController();
17 -
18 bool _validate = false; 17 bool _validate = false;
19 int userRole = 0; 18 int userRole = 0;
20 19
...@@ -31,6 +30,13 @@ class _SignUpLocalState extends State<SignUpLocal> { ...@@ -31,6 +30,13 @@ class _SignUpLocalState extends State<SignUpLocal> {
31 'password': passwordController.text, 30 'password': passwordController.text,
32 'passwordCheck': passwordValidController.text 31 'passwordCheck': passwordValidController.text
33 })); 32 }));
33 +
34 + print(response.statusCode);
35 + if (response.statusCode == 201) {
36 + return "정보 입력 완료";
37 + } else {
38 + return "오류";
39 + }
34 } 40 }
35 41
36 @override 42 @override
...@@ -150,22 +156,6 @@ class _SignUpLocalState extends State<SignUpLocal> { ...@@ -150,22 +156,6 @@ class _SignUpLocalState extends State<SignUpLocal> {
150 ), 156 ),
151 ), 157 ),
152 ), 158 ),
153 - TextFormField(
154 - keyboardType: TextInputType.text,
155 - controller: medicineNameController,
156 - decoration: InputDecoration(
157 - labelText: '약 이름',
158 - helperText: '약의 이름을 읿력하세요',
159 - ),
160 - ),
161 - TextFormField(
162 - keyboardType: TextInputType.text,
163 - controller: medicineFactureController,
164 - decoration: InputDecoration(
165 - labelText: '약 제조사 이름',
166 - helperText: '약 제조사의 이름을 읿력하세요',
167 - ),
168 - ),
169 ], 159 ],
170 ), 160 ),
171 ), 161 ),
...@@ -177,11 +167,43 @@ class _SignUpLocalState extends State<SignUpLocal> { ...@@ -177,11 +167,43 @@ class _SignUpLocalState extends State<SignUpLocal> {
177 child: RaisedButton( 167 child: RaisedButton(
178 onPressed: () async { 168 onPressed: () async {
179 String saveMessage = await signup_Validate(); 169 String saveMessage = await signup_Validate();
180 - print('saveMessage'); 170 + if (saveMessage == "정보 입력 완료") {
181 - print(saveMessage); 171 + showDialog(
182 - print(emailController.text); 172 + context: context,
183 - print(passwordController.text); 173 + builder: (BuildContext context) {
184 - print(passwordValidController.text); 174 + return AlertDialog(
175 + title: new Text('회원 가입'),
176 + content: new Text('회원 가입이 완료 되었습니다.'),
177 + actions: <Widget>[
178 + new FlatButton(
179 + child: new Text('Close'),
180 + onPressed: () {
181 + Navigator.push(
182 + context,
183 + MaterialPageRoute(
184 + builder: (BuildContext context) =>
185 + HomePage()));
186 + })
187 + ],
188 + );
189 + });
190 + } else {
191 + showDialog(
192 + context: context,
193 + builder: (BuildContext context) {
194 + return AlertDialog(
195 + title: new Text('회원 가입 오류'),
196 + content: new Text('정확한 이메일, 비밀번호를 입력해 주세요.'),
197 + actions: <Widget>[
198 + new FlatButton(
199 + child: new Text('Close'),
200 + onPressed: () {
201 + Navigator.of(context).pop();
202 + })
203 + ],
204 + );
205 + });
206 + }
185 }, 207 },
186 shape: RoundedRectangleBorder( 208 shape: RoundedRectangleBorder(
187 borderRadius: new BorderRadius.circular(18.0), 209 borderRadius: new BorderRadius.circular(18.0),
......
1 +class Bottle {
2 + final int bottleId;
3 + final int temperature;
4 + final int humidity;
5 + final int balance;
6 + final DateTime recentOpen;
7 + final int medicineId;
8 + final int hubId;
9 + final int dosage;
10 +
11 + Bottle(
12 + {this.bottleId,
13 + this.temperature,
14 + this.humidity,
15 + this.balance,
16 + this.recentOpen,
17 + this.medicineId,
18 + this.hubId,
19 + this.dosage});
20 +
21 + factory Bottle.fromJson(Map<String, dynamic> parsedJson) {
22 + var list = parsedJson['data'] as List;
23 +
24 + return Bottle(
25 + bottleId: parsedJson['bottleId'],
26 + temperature: parsedJson['temperature'],
27 + humidity: parsedJson['humidity'],
28 + balance: parsedJson['balance'],
29 + recentOpen: parsedJson['recentOpen'],
30 + medicineId: parsedJson['medicineId'],
31 + hubId: parsedJson['hubId'],
32 + dosage: parsedJson['dosage'],
33 + );
34 + }
35 +
36 + Map<String, dynamic> toJson() => {
37 + "bottleId": bottleId,
38 + "temperature": temperature,
39 + "humidity:": humidity,
40 + "balance": balance,
41 + "recentOpen": recentOpen,
42 + "medicineId": medicineId,
43 + "hubId": hubId,
44 + "dosage": dosage,
45 + };
46 +}