고원빈

[frontend] login authorization 문제 해결

...@@ -82,3 +82,5 @@ appbar 관련 디자인은 추후 구현 예정 ...@@ -82,3 +82,5 @@ appbar 관련 디자인은 추후 구현 예정
82 + 메인 페이지 데이터 출력 완료 82 + 메인 페이지 데이터 출력 완료
83 83
84 84
85 +### 2021-05-25
86 ++ 로그인 권한 문제 해결
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -3,6 +3,7 @@ import 'dart:convert'; ...@@ -3,6 +3,7 @@ import 'dart:convert';
3 import 'package:shared_preferences/shared_preferences.dart'; 3 import 'package:shared_preferences/shared_preferences.dart';
4 import 'package:http/http.dart' as http; 4 import 'package:http/http.dart' as http;
5 import 'package:flutter_dotenv/flutter_dotenv.dart'; 5 import 'package:flutter_dotenv/flutter_dotenv.dart';
6 +import 'package:intl/intl.dart';
6 7
7 import 'models/Bottle.dart'; 8 import 'models/Bottle.dart';
8 import 'models/Medicine.dart'; 9 import 'models/Medicine.dart';
...@@ -28,6 +29,7 @@ class _DashBoardState extends State<DashBoard> { ...@@ -28,6 +29,7 @@ class _DashBoardState extends State<DashBoard> {
28 Bottle _bottleinformation = new Bottle(); 29 Bottle _bottleinformation = new Bottle();
29 int _selectedIndex = 0; 30 int _selectedIndex = 0;
30 Medicine _medicineInformation = new Medicine(); 31 Medicine _medicineInformation = new Medicine();
32 +
31 Widget build(BuildContext context) { 33 Widget build(BuildContext context) {
32 _selectedIndex = widget.pageNumber; 34 _selectedIndex = widget.pageNumber;
33 _medicineInformation = widget.medicineInformation; 35 _medicineInformation = widget.medicineInformation;
...@@ -125,17 +127,6 @@ class _DashBoardState extends State<DashBoard> { ...@@ -125,17 +127,6 @@ class _DashBoardState extends State<DashBoard> {
125 } 127 }
126 128
127 Widget mainpage(BuildContext context, Medicine medicineInformation) { 129 Widget mainpage(BuildContext context, Medicine medicineInformation) {
128 - Future<String> getHubList() async {
129 - SharedPreferences prefs = await SharedPreferences.getInstance();
130 -
131 - http.Response response =
132 - await http.get(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'));
133 -
134 - print(response.statusCode);
135 - }
136 -
137 - //현재 접속 중인 허브 리스트 id와 약병 리스트 id 출력
138 - //약 상세 정보 가져오기 --> 이건 Detail Medicine에서 가져 오면 됨
139 final Size size = MediaQuery.of(context).size; 130 final Size size = MediaQuery.of(context).size;
140 return Scaffold( 131 return Scaffold(
141 backgroundColor: Colors.white, 132 backgroundColor: Colors.white,
...@@ -578,7 +569,8 @@ Widget ineerInformationpage(BuildContext context, Bottle bottleinformation) { ...@@ -578,7 +569,8 @@ Widget ineerInformationpage(BuildContext context, Bottle bottleinformation) {
578 child: Text( 569 child: Text(
579 bottleinformation.recentOpen == null 570 bottleinformation.recentOpen == null
580 ? '-' 571 ? '-'
581 - : bottleinformation.recentOpen, 572 + : DateFormat.Hm()
573 + .format(bottleinformation.recentOpen),
582 textAlign: TextAlign.center, 574 textAlign: TextAlign.center,
583 textScaleFactor: 1.0, 575 textScaleFactor: 1.0,
584 style: TextStyle( 576 style: TextStyle(
...@@ -676,9 +668,9 @@ Widget outerInformationpage(BuildContext context, Bottle bottleinformation) { ...@@ -676,9 +668,9 @@ Widget outerInformationpage(BuildContext context, Bottle bottleinformation) {
676 mainAxisAlignment: MainAxisAlignment.center, 668 mainAxisAlignment: MainAxisAlignment.center,
677 children: [ 669 children: [
678 Text( 670 Text(
679 - bottleinformation.toString() == null 671 + bottleinformation.dosage == null
680 ? '-' 672 ? '-'
681 - : bottleinformation.toString(), 673 + : bottleinformation.dosage.toString(),
682 textAlign: TextAlign.center, 674 textAlign: TextAlign.center,
683 textScaleFactor: 1.0, 675 textScaleFactor: 1.0,
684 style: TextStyle( 676 style: TextStyle(
......
...@@ -6,6 +6,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; ...@@ -6,6 +6,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart';
6 import '../models/Bottle.dart'; 6 import '../models/Bottle.dart';
7 import '../DashBoard.dart'; 7 import '../DashBoard.dart';
8 import '../models/Medicine.dart'; 8 import '../models/Medicine.dart';
9 +import '../../utils/user_secure_stoarge.dart';
9 10
10 class BottleList extends StatefulWidget { 11 class BottleList extends StatefulWidget {
11 List<Bottle> bottlelist; 12 List<Bottle> bottlelist;
...@@ -21,10 +22,12 @@ class _BottleListState extends State<BottleList> { ...@@ -21,10 +22,12 @@ class _BottleListState extends State<BottleList> {
21 Medicine _medicineinformation = new Medicine(); 22 Medicine _medicineinformation = new Medicine();
22 23
23 Future<Bottle> getbottle(int index) async { 24 Future<Bottle> getbottle(int index) async {
24 - http.Response response = await http.get(Uri.encodeFull( 25 + String usertoken = await UserSecureStorage.getUserToken();
25 - DotEnv().env['SERVER_URL'] + 26 + http.Response response = await http.get(
27 + Uri.encodeFull(DotEnv().env['SERVER_URL'] +
26 'bottle/' + 28 'bottle/' +
27 - widget.bottlelist[index].bottleId.toString())); 29 + widget.bottlelist[index].bottleId.toString()),
30 + headers: {"authorization": usertoken});
28 31
29 if (response.statusCode == 200) { 32 if (response.statusCode == 200) {
30 Map<String, dynamic> jsonData = jsonDecode(response.body); 33 Map<String, dynamic> jsonData = jsonDecode(response.body);
...@@ -34,10 +37,13 @@ class _BottleListState extends State<BottleList> { ...@@ -34,10 +37,13 @@ class _BottleListState extends State<BottleList> {
34 } 37 }
35 38
36 Future<Bottle> getmedicine(int index) async { 39 Future<Bottle> getmedicine(int index) async {
37 - http.Response medicineresponse = await http.get(Uri.encodeFull( 40 + String usertoken = await UserSecureStorage.getUserToken();
38 - DotEnv().env['SERVER_URL'] + 41 + http.Response medicineresponse = await http.get(
42 + Uri.encodeFull(DotEnv().env['SERVER_URL'] +
39 'medicine/' + 43 'medicine/' +
40 - widget.bottlelist[index].medicineId.toString())); 44 + widget.bottlelist[index].medicineId.toString()),
45 + headers: {"authorization": usertoken},
46 + );
41 if (medicineresponse.statusCode == 200) { 47 if (medicineresponse.statusCode == 200) {
42 Map<String, dynamic> data = jsonDecode(medicineresponse.body); 48 Map<String, dynamic> data = jsonDecode(medicineresponse.body);
43 _medicineinformation = Medicine.fromJson(data); 49 _medicineinformation = Medicine.fromJson(data);
...@@ -91,11 +97,8 @@ class _BottleListState extends State<BottleList> { ...@@ -91,11 +97,8 @@ class _BottleListState extends State<BottleList> {
91 ), 97 ),
92 trailing: Icon(Icons.arrow_forward), 98 trailing: Icon(Icons.arrow_forward),
93 onTap: () async { 99 onTap: () async {
94 - getbottle(index); 100 + await getbottle(index);
95 - getmedicine(index); 101 + await getmedicine(index);
96 - print(_bottleinformation);
97 - print(_medicineinformation);
98 -
99 Navigator.push( 102 Navigator.push(
100 context, 103 context,
101 MaterialPageRoute( 104 MaterialPageRoute(
...@@ -104,8 +107,10 @@ class _BottleListState extends State<BottleList> { ...@@ -104,8 +107,10 @@ class _BottleListState extends State<BottleList> {
104 bottleInformation: _bottleinformation, 107 bottleInformation: _bottleinformation,
105 medicineInformation: _medicineinformation, 108 medicineInformation: _medicineinformation,
106 ), 109 ),
107 - )); 110 + ),
108 - }), 111 + );
112 + },
113 + ),
109 ); 114 );
110 }, 115 },
111 separatorBuilder: (BuildContext contetx, int index) => 116 separatorBuilder: (BuildContext contetx, int index) =>
......
...@@ -6,6 +6,7 @@ import 'dart:convert'; ...@@ -6,6 +6,7 @@ import 'dart:convert';
6 import 'package:http/http.dart' as http; 6 import 'package:http/http.dart' as http;
7 import 'package:flutter_dotenv/flutter_dotenv.dart'; 7 import 'package:flutter_dotenv/flutter_dotenv.dart';
8 import '../models/Medicine.dart'; 8 import '../models/Medicine.dart';
9 +import '../../utils/user_secure_stoarge.dart';
9 10
10 class DetailMedicine extends StatefulWidget { 11 class DetailMedicine extends StatefulWidget {
11 Medicine searchMedicine; 12 Medicine searchMedicine;
...@@ -20,10 +21,14 @@ class _DetailMedicineState extends State<DetailMedicine> { ...@@ -20,10 +21,14 @@ class _DetailMedicineState extends State<DetailMedicine> {
20 final medicineDosageController = TextEditingController(); 21 final medicineDosageController = TextEditingController();
21 //약 등록 22 //약 등록
22 Future<String> patchMedcine() async { 23 Future<String> patchMedcine() async {
24 + String usertoken = await UserSecureStorage.getUserToken();
23 http.Response response = await http.patch( 25 http.Response response = await http.patch(
24 Uri.encodeFull( 26 Uri.encodeFull(
25 DotEnv().env['SERVER_URL'] + 'bottle/' + widget.bottleId), 27 DotEnv().env['SERVER_URL'] + 'bottle/' + widget.bottleId),
26 - headers: {"Content-Type": "application/json"}, 28 + headers: {
29 + "Content-Type": "application/json",
30 + "authorization": usertoken
31 + },
27 body: jsonEncode({ 32 body: jsonEncode({
28 'medicineId': widget.searchMedicine.medicineId, 33 'medicineId': widget.searchMedicine.medicineId,
29 'dosage': medicineDosageController.text 34 'dosage': medicineDosageController.text
......
...@@ -7,6 +7,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; ...@@ -7,6 +7,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart';
7 import 'RegisterBottle.dart'; 7 import 'RegisterBottle.dart';
8 import '../models/Bottle.dart'; 8 import '../models/Bottle.dart';
9 import 'BottleList.dart'; 9 import 'BottleList.dart';
10 +import '../../utils/user_secure_stoarge.dart';
10 11
11 class HubList extends StatefulWidget { 12 class HubList extends StatefulWidget {
12 List<int> hublist; 13 List<int> hublist;
...@@ -20,8 +21,13 @@ class _HubListState extends State<HubList> { ...@@ -20,8 +21,13 @@ class _HubListState extends State<HubList> {
20 List<Bottle> _bottleList = new List<Bottle>(); 21 List<Bottle> _bottleList = new List<Bottle>();
21 //Get BottleList 22 //Get BottleList
22 Future<String> getBottleList(int hubid) async { 23 Future<String> getBottleList(int hubid) async {
23 - http.Response response = await http.get(Uri.encodeFull( 24 + String usertoken = await UserSecureStorage.getUserToken();
24 - DotEnv().env['SERVER_URL'] + 'bottle/hub/' + hubid.toString())); 25 + http.Response response = await http.get(
26 + Uri.encodeFull(
27 + DotEnv().env['SERVER_URL'] + 'bottle/hub/' + hubid.toString()),
28 + headers: {"authorization": usertoken},
29 + );
30 + print(response.body);
25 if (_bottleList.length != 0) { 31 if (_bottleList.length != 0) {
26 _bottleList.clear(); 32 _bottleList.clear();
27 } 33 }
......
...@@ -6,6 +6,7 @@ import 'package:http/http.dart' as http; ...@@ -6,6 +6,7 @@ import 'package:http/http.dart' as http;
6 import 'package:flutter_dotenv/flutter_dotenv.dart'; 6 import 'package:flutter_dotenv/flutter_dotenv.dart';
7 7
8 import 'SearchMedicine.dart'; 8 import 'SearchMedicine.dart';
9 +import '../../utils/user_secure_stoarge.dart';
9 10
10 class RegisterBottle extends StatefulWidget { 11 class RegisterBottle extends StatefulWidget {
11 final String hubid; 12 final String hubid;
...@@ -18,9 +19,13 @@ class _RegisterBottleState extends State<RegisterBottle> { ...@@ -18,9 +19,13 @@ class _RegisterBottleState extends State<RegisterBottle> {
18 final medicineBottleIDController = TextEditingController(); 19 final medicineBottleIDController = TextEditingController();
19 20
20 Future<String> registerhub_Validate() async { 21 Future<String> registerhub_Validate() async {
22 + String usertoken = await UserSecureStorage.getUserToken();
21 http.Response bottleresponse = await http.post( 23 http.Response bottleresponse = await http.post(
22 Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'bottle'), 24 Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'bottle'),
23 - headers: {"Content-Type": "application/json"}, 25 + headers: {
26 + "Content-Type": "application/json",
27 + "authorization": usertoken
28 + },
24 body: jsonEncode({ 29 body: jsonEncode({
25 'bottleId': medicineBottleIDController.text, 30 'bottleId': medicineBottleIDController.text,
26 'hubId': widget.hubid 31 'hubId': widget.hubid
......
...@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http; ...@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http;
5 import 'package:flutter_dotenv/flutter_dotenv.dart'; 5 import 'package:flutter_dotenv/flutter_dotenv.dart';
6 6
7 import 'RegisterBottle.dart'; 7 import 'RegisterBottle.dart';
8 +import '../../utils/user_secure_stoarge.dart';
8 9
9 class RegisterHub extends StatefulWidget { 10 class RegisterHub extends StatefulWidget {
10 @override 11 @override
...@@ -18,9 +19,13 @@ class _RegisterHubState extends State<RegisterHub> { ...@@ -18,9 +19,13 @@ class _RegisterHubState extends State<RegisterHub> {
18 final medicineHubHostController = TextEditingController(); 19 final medicineHubHostController = TextEditingController();
19 20
20 Future<String> registerhub_Validate() async { 21 Future<String> registerhub_Validate() async {
21 - http.Response hubresponse = 22 + String usertoken = await UserSecureStorage.getUserToken();
22 - await http.post(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'), 23 + http.Response hubresponse = await http.post(
23 - headers: {"Content-Type": "application/json"}, 24 + Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'),
25 + headers: {
26 + "Content-Type": "application/json",
27 + "authorization": usertoken
28 + },
24 body: jsonEncode({ 29 body: jsonEncode({
25 'hubId': medicineHubIDController.text, 30 'hubId': medicineHubIDController.text,
26 'host': medicineHubHostController.text, 31 'host': medicineHubHostController.text,
......
...@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http; ...@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http;
5 import 'package:flutter_dotenv/flutter_dotenv.dart'; 5 import 'package:flutter_dotenv/flutter_dotenv.dart';
6 import '../models/Medicine.dart'; 6 import '../models/Medicine.dart';
7 import 'DetailMedicine.dart'; 7 import 'DetailMedicine.dart';
8 +import '../../utils/user_secure_stoarge.dart';
8 9
9 class SearchMedicine extends StatefulWidget { 10 class SearchMedicine extends StatefulWidget {
10 String bottleId; 11 String bottleId;
...@@ -19,9 +20,13 @@ class _SearchMedicineState extends State<SearchMedicine> { ...@@ -19,9 +20,13 @@ class _SearchMedicineState extends State<SearchMedicine> {
19 final medicineCompanyController = TextEditingController(); 20 final medicineCompanyController = TextEditingController();
20 21
21 Future<String> postMeicineList() async { 22 Future<String> postMeicineList() async {
22 - http.Response response = 23 + String usertoken = await UserSecureStorage.getUserToken();
23 - await http.post(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'medicine'), 24 + http.Response response = await http.post(
24 - headers: {"Content-Type": "application/json"}, 25 + Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'medicine'),
26 + headers: {
27 + "Content-Type": "application/json",
28 + "authorization": usertoken
29 + },
25 body: jsonEncode({ 30 body: jsonEncode({
26 'name': medicineNameController.text, 31 'name': medicineNameController.text,
27 'company': medicineCompanyController.text, 32 'company': medicineCompanyController.text,
......
...@@ -3,10 +3,11 @@ import 'package:flutter/material.dart'; ...@@ -3,10 +3,11 @@ import 'package:flutter/material.dart';
3 import 'package:flutter/services.dart'; 3 import 'package:flutter/services.dart';
4 import 'package:http/http.dart' as http; 4 import 'package:http/http.dart' as http;
5 import 'package:flutter_dotenv/flutter_dotenv.dart'; 5 import 'package:flutter_dotenv/flutter_dotenv.dart';
6 -import 'package:shared_preferences/shared_preferences.dart'; 6 +
7 -import '../DashBoard.dart'; 7 +import '../../utils/user_secure_stoarge.dart';
8 import 'HubList.dart'; 8 import 'HubList.dart';
9 import 'RegsiterHub.dart'; 9 import 'RegsiterHub.dart';
10 +import '../models/User.dart';
10 11
11 class SignInPage extends StatefulWidget { 12 class SignInPage extends StatefulWidget {
12 @override 13 @override
...@@ -18,9 +19,11 @@ class _SignInPageState extends State<SignInPage> { ...@@ -18,9 +19,11 @@ class _SignInPageState extends State<SignInPage> {
18 bool passwordVisible = false; 19 bool passwordVisible = false;
19 bool _validateEmail = false; 20 bool _validateEmail = false;
20 bool _validatePassword = false; 21 bool _validatePassword = false;
22 +
21 final emailController = TextEditingController(); 23 final emailController = TextEditingController();
22 final passwordController = TextEditingController(); 24 final passwordController = TextEditingController();
23 25
26 + User user;
24 List<int> _hublist = new List<int>(); //허브이름을 만들어야 할 것 같은데 임시로 허브 id만 고르게 함 27 List<int> _hublist = new List<int>(); //허브이름을 만들어야 할 것 같은데 임시로 허브 id만 고르게 함
25 28
26 //Login 함수 29 //Login 함수
...@@ -28,12 +31,18 @@ class _SignInPageState extends State<SignInPage> { ...@@ -28,12 +31,18 @@ class _SignInPageState extends State<SignInPage> {
28 http.Response response = await http.post( 31 http.Response response = await http.post(
29 Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'auth/login'), 32 Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'auth/login'),
30 headers: {"Content-Type": "application/json"}, 33 headers: {"Content-Type": "application/json"},
31 - body: jsonEncode({ 34 + body: jsonEncode(
35 + {
32 'userId': _email, 36 'userId': _email,
33 'password': _password, 37 'password': _password,
34 - })); 38 + },
39 + ),
40 + );
35 41
36 if (response.statusCode == 200) { 42 if (response.statusCode == 200) {
43 + Map<String, dynamic> data = jsonDecode(response.body);
44 + user = User.fromJson(data);
45 + print(user);
37 return "로그인 성공"; 46 return "로그인 성공";
38 } else if (response.statusCode == 400) { 47 } else if (response.statusCode == 400) {
39 return "올바르지 않은 아이디 및 패스워드"; 48 return "올바르지 않은 아이디 및 패스워드";
...@@ -44,11 +53,14 @@ class _SignInPageState extends State<SignInPage> { ...@@ -44,11 +53,14 @@ class _SignInPageState extends State<SignInPage> {
44 53
45 //Get Bottle List 함수 54 //Get Bottle List 함수
46 Future<String> getHubList() async { 55 Future<String> getHubList() async {
47 - http.Response response = 56 + String usertoken = await UserSecureStorage.getUserToken();
48 - await http.get(Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub')); 57 + http.Response response = await http.get(
58 + Uri.encodeFull(DotEnv().env['SERVER_URL'] + 'hub'),
59 + headers: {"authorization": usertoken},
60 + );
49 61
50 List<dynamic> values = new List<dynamic>(); 62 List<dynamic> values = new List<dynamic>();
51 - 63 + print(values);
52 if (_hublist.length != 0) { 64 if (_hublist.length != 0) {
53 _hublist.clear(); 65 _hublist.clear();
54 } 66 }
...@@ -228,6 +240,8 @@ class _SignInPageState extends State<SignInPage> { ...@@ -228,6 +240,8 @@ class _SignInPageState extends State<SignInPage> {
228 RegisterHub(), 240 RegisterHub(),
229 )); 241 ));
230 } else if (result == "get완료") { 242 } else if (result == "get완료") {
243 + UserSecureStorage.setUserToken(
244 + user.token);
231 Navigator.push( 245 Navigator.push(
232 context, 246 context,
233 MaterialPageRoute( 247 MaterialPageRoute(
......
...@@ -3,7 +3,7 @@ class Bottle { ...@@ -3,7 +3,7 @@ class Bottle {
3 final int temperature; 3 final int temperature;
4 final int humidity; 4 final int humidity;
5 final int balance; 5 final int balance;
6 - final String recentOpen; 6 + final DateTime recentOpen;
7 final int medicineId; 7 final int medicineId;
8 final int hubId; 8 final int hubId;
9 final int dosage; 9 final int dosage;
...@@ -24,7 +24,7 @@ class Bottle { ...@@ -24,7 +24,7 @@ class Bottle {
24 temperature: parsedJson['temperature'], 24 temperature: parsedJson['temperature'],
25 humidity: parsedJson['humidity'], 25 humidity: parsedJson['humidity'],
26 balance: parsedJson['balance'], 26 balance: parsedJson['balance'],
27 - recentOpen: parsedJson['recentOpen'], 27 + recentOpen: DateTime.parse(parsedJson['recentOpen']),
28 medicineId: parsedJson['medicineId'], 28 medicineId: parsedJson['medicineId'],
29 hubId: parsedJson['hubId'], 29 hubId: parsedJson['hubId'],
30 dosage: parsedJson['dosage'], 30 dosage: parsedJson['dosage'],
......
1 +class User {
2 + final String userId;
3 + final String token;
4 +
5 + User({this.userId, this.token});
6 +
7 + factory User.fromJson(Map<String, dynamic> parsedJson) {
8 + return User(
9 + userId: parsedJson['userId'],
10 + token: parsedJson['token'],
11 + );
12 + }
13 + Map<String, dynamic> toJson() => {
14 + "userId": userId,
15 + "token": token,
16 + };
17 +}
1 +import 'package:flutter_secure_storage/flutter_secure_storage.dart';
2 +
3 +class UserSecureStorage {
4 + static final _storage = FlutterSecureStorage();
5 +
6 + static const _keyToken = 'usertoken';
7 +
8 + static const _keyUserId = 'userid';
9 +
10 + static Future setUserId(String userid) async =>
11 + await _storage.write(key: _keyUserId, value: userid);
12 +
13 + static Future<String> getUserID() async =>
14 + await _storage.read(key: _keyUserId);
15 +
16 + static Future setUserToken(String userToken) async =>
17 + await _storage.write(key: _keyToken, value: userToken);
18 +
19 + static Future<String> getUserToken() async =>
20 + await _storage.read(key: _keyToken);
21 +}
...@@ -132,6 +132,13 @@ packages: ...@@ -132,6 +132,13 @@ packages:
132 url: "https://pub.dartlang.org" 132 url: "https://pub.dartlang.org"
133 source: hosted 133 source: hosted
134 version: "0.7.0" 134 version: "0.7.0"
135 + flutter_secure_storage:
136 + dependency: "direct main"
137 + description:
138 + name: flutter_secure_storage
139 + url: "https://pub.dartlang.org"
140 + source: hosted
141 + version: "3.3.5"
135 flutter_test: 142 flutter_test:
136 dependency: "direct dev" 143 dependency: "direct dev"
137 description: flutter 144 description: flutter
...@@ -415,4 +422,4 @@ packages: ...@@ -415,4 +422,4 @@ packages:
415 version: "0.1.2" 422 version: "0.1.2"
416 sdks: 423 sdks:
417 dart: ">=2.10.0-110 <2.11.0" 424 dart: ">=2.10.0-110 <2.11.0"
418 - flutter: ">=1.12.13+hotfix.6 <2.0.0" 425 + flutter: ">=1.20.0 <2.0.0"
......
...@@ -38,6 +38,7 @@ dependencies: ...@@ -38,6 +38,7 @@ dependencies:
38 http: ^0.12.0+4 38 http: ^0.12.0+4
39 flutter_dotenv: ^2.1.0 39 flutter_dotenv: ^2.1.0
40 numberpicker: ^1.3.0 40 numberpicker: ^1.3.0
41 + flutter_secure_storage: ^3.3.5
41 42
42 dev_dependencies: 43 dev_dependencies:
43 flutter_test: 44 flutter_test:
......