From 02d8185f9521a96c634036da6cad9fcdf204b770 Mon Sep 17 00:00:00 2001 From: jefry Date: Thu, 24 Feb 2022 17:04:05 +0700 Subject: [PATCH] backup done --- android/app/src/main/AndroidManifest.xml | 2 + lib/Util/DBHelper.dart | 83 +++++++++++++++----- lib/Util/Prefs.dart | 3 + lib/home_page.dart | 128 +++++++++++++++++++------------ lib/login_page.dart | 14 +++- lib/main.dart | 2 +- lib/stocking.dart | 34 +++++++- pubspec.lock | 119 ++++++++++++++++------------ pubspec.yaml | 18 ++--- 9 files changed, 274 insertions(+), 129 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9cc2a8b..019e8be 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + + get db async { if (_db == null) _db = await initDb(); + return _db; + } + backupDb() async{ try{ - //backupDatabase - String backupPath = join(_db.path.substring(0,_db.path.indexOf("/Android"))+"/Download/UnitDBBackup/", "${prefs.getString(keyClass.stock_id)}_UnitStocking.db"); - io.File dbFile = io.File(_db.path); - dbFile.copySync(backupPath); + // if(dbPath == null || dbPath == ''){ + final database = await db; + var dbPath = database.path; + await DBHelper.database.closeDb(); + // } + await prefs.remove(keyClass.backup_stock_id); + var stock_id = prefs.getString(keyClass.stock_id)??''; + if(stock_id != ''){ + var cabang = prefs.getString(keyClass.cabang_id)??''; + if(cabang !='' && cabang != null ) await prefs.setString(keyClass.backup_cabang_id,cabang); + if(stock_id !='' && stock_id != null ) await prefs.setString(keyClass.backup_stock_id,stock_id); + //backupDatabase + String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_UnitStocking.db"); + io.File backupFile = new io.File(backupPath); + io.File dbFile = io.File(dbPath); + if(dbFile.existsSync()){ + // dbFile.copySync(backupPath); + Uint8List byte = dbFile.readAsBytesSync(); + backupFile.writeAsBytesSync(byte); + return {"STATUS":1,"MSG":"Backup Berhasil!"}; + } + else{ + return {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; + print('file backup dont exist tho'); + } + } + else{ + return {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; + } } catch(e){ print(e); + return {"STATUS":0,"MSG":"Backup gagal!"}; } - return _db; } - initDb() async { io.Directory documentsDirectory = await getExternalStorageDirectory(); String path = join(documentsDirectory.path, "UnitStocking.db"); @@ -35,22 +64,37 @@ class DBHelper { } restoreDb()async{ - await closeDb(); - io.Directory documentsDirectory = await getExternalStorageDirectory(); - String backupPath = join(documentsDirectory.path.substring(0,documentsDirectory.path.indexOf("/Android"))+"/Download/UnitDBBackup/", "${prefs.getString(keyClass.stock_id)}_UnitStocking.db"); - io.File backupdbFile = io.File(backupPath); - if(backupdbFile.existsSync()){ - String path = join(documentsDirectory.path, "UnitStocking.db"); - backupdbFile.copySync(path); - return {"STATUS":1,"MSG":"File Back up successfull"}; + var result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; + if(prefs.getString(keyClass.stock_id) == null || prefs.getString(keyClass.stock_id) == prefs.getString(keyClass.backup_cabang_id)){ + if(prefs.getString(keyClass.backup_stock_id)!=null && prefs.getString(keyClass.backup_cabang_id)!= null){ + await util.permissionCheck(context,pHandler.Permission.storage,()async{ + io.Directory documentsDirectory = await getExternalStorageDirectory(); + String backupPath = join(documentsDirectory.path.substring(0,documentsDirectory.path.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_UnitStocking.db"); + io.File backupdbFile = io.File(backupPath); + if(backupdbFile.existsSync()){ + io.File dbFile = new io.File(join(documentsDirectory.path, "UnitStocking.db")); + Uint8List byte = backupdbFile.readAsBytesSync(); + dbFile.writeAsBytesSync(byte); + result = {"STATUS":1,"MSG":"File Back up successfull"}; + await DBHelper.database.closeDb(); + } + else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; + },customMessage: " untuk menyimpan data backup"); + } } - return {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; + else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; + return result; } closeDb() async { - final database = await db; - await database.close(); - _db = null; + try{ + Database database = await db; + if(database.isOpen) await database.close(); + _db = null; + } + catch(e){ + _db = null; + } } _onCreate(Database db, int version) async { @@ -266,9 +310,11 @@ class DBHelper { try{ final database = await db; var res = await database.query(tableName.values,where: "${columnName.name} = ?",whereArgs: [value]); + var res2 = await database.query(tableName.values); return res.isEmpty?null:valueTab.fromJson(res.first); } catch(e){ + print(e); return null; } } @@ -307,7 +353,6 @@ class DBHelper { newValue.name, newValue.value ]); - print('Row Inserted'); return res; } catch(e){ diff --git a/lib/Util/Prefs.dart b/lib/Util/Prefs.dart index eed4d1a..8048631 100644 --- a/lib/Util/Prefs.dart +++ b/lib/Util/Prefs.dart @@ -12,6 +12,9 @@ class keyClass{ static String targetProccess = 'dbPath'; static String submitProccess = 'SUBMIT'; static String stock_id = 'STOCK_TAKING_UNIT_ID'; + static String backup_stock_id = 'BACKUP_STOCK_TAKING_UNIT_ID'; + static String backup_cabang_id = 'BACKUP_CABANG_ID'; + static String client_credential = 'CLIENT_CREDENTIAL'; static String rest_data = 'REST_DATA'; static String tgl_start = 'TGL_START'; diff --git a/lib/home_page.dart b/lib/home_page.dart index 98b6823..f0c04d6 100644 --- a/lib/home_page.dart +++ b/lib/home_page.dart @@ -16,6 +16,7 @@ import 'package:intl/intl.dart'; import 'main.dart'; import 'Util/Prefs.dart'; import 'Util/UnitModel.dart'; +import 'package:permission_handler/permission_handler.dart' as pHandler; class HomePage extends StatefulWidget { // HomePage({Key key}) : super(key: key); @@ -36,7 +37,7 @@ class _HomePageState extends State { String state = ''; final hostAddress = new TextEditingController(); - clearData(context)async{ + clearData(context,{backup=true})async{ setState(() { progressDL = null; isLoading = false; @@ -56,40 +57,31 @@ class _HomePageState extends State { onPressed: ()async{ util.showLoading(context); await Future.sync(()async{ - await prefs.remove(keyClass.lastDownload); - await prefs.remove(keyClass.lastUpload); - await prefs.remove(keyClass.targetProccess); - await prefs.remove(keyClass.submitProccess); - await prefs.remove(keyClass.stock_id); - setState(() { - lastUpload = ''; - lastDownload = ''; - timeString = ''; - }); -// var result = await DBHelper.database.deleteAll(); -// if(result!=null) { -// await DBHelper.database.closeDb(); -// if(result!=null){ try{ Directory documentsDirectory = await getExternalStorageDirectory(); String path = join(documentsDirectory.path, "UnitStocking.db"); File db = File(path); if(db.existsSync()){ + await DBHelper.database.closeDb(); + //auto backup + // if(backup)await DBHelper.database.backupDb(context); db.deleteSync(); + await prefs.remove(keyClass.lastDownload); + await prefs.remove(keyClass.lastUpload); + await prefs.remove(keyClass.targetProccess); + await prefs.remove(keyClass.submitProccess); + await prefs.remove(keyClass.stock_id); + setState(() { + lastUpload = ''; + lastDownload = ''; + timeString = ''; + }); } } catch(e){ print(e); util.showFlushbar(context, 'Failed to delete database file',color: Colors.red); } -// } -// else{ -// errMsg = 'Failed to clear unit data'; -// } -// } -// else{ -// errMsg = 'Failed to clear unit data'; -// } }); Navigator.pop(context); Navigator.pop(context,true); @@ -133,6 +125,7 @@ class _HomePageState extends State { lastUpload = prefs.getString(keyClass.lastUpload)??''; WidgetsBinding.instance.addPostFrameCallback((_) async { await _check_Update(); + await util.permissionCheck(context,pHandler.Permission.storage,()async{print("storage permit granted!");},customMessage: " untuk menyimpan data backup"); }); } @@ -522,12 +515,22 @@ class _HomePageState extends State { ), ), PopupMenuItem( + value:'backup', + child: Row( + children: [ + Icon(Icons.save,color: Colors.black,), + SizedBox(width: 10,), + Text('Backup Data') + ], + ), + ), + PopupMenuItem( value:'restore', child: Row( children: [ Icon(Icons.sync,color: Colors.black,), SizedBox(width: 10,), - Text('Restore Backup') + Text('Restore Data') ], ), ), @@ -670,40 +673,71 @@ class _HomePageState extends State { prefs.setBool(keyClass.logged_in, false); Navigator.pushNamed(context, '/login'); } + if(value == 'backup'){ + var result = await DBHelper.database.backupDb(); + util.showFlushbar(context, result['MSG'],color: result["STATUS"]==1?Colors.grey:Colors.red); + } if(value == 'restore'){ - await showDialog(context: context,builder: (context)=>AlertDialog( + bool isRestore = await showDialog(context: context,builder: (context)=>AlertDialog( title: Text('Restore Data ?'), - content: Text('Restore data akan menghapus dan mengganti data unit yang ada dengan data unit backup.'), + content: Text('Restore data akan menghapus dan mengganti data unit dan cabang yang ada dengan data backup.'), actions: [ TextButton( child: Text('Proceed'), onPressed: ()async{ - util.showLoading(context); - var result = await DBHelper.database.restoreDb(); - if(result["STATUS"]==1){ - await prefs.remove(keyClass.lastDownload); - await prefs.remove(keyClass.lastUpload); - await prefs.remove(keyClass.targetProccess); - await prefs.remove(keyClass.submitProccess); - setState(() { - lastUpload = ''; - lastDownload = ''; - timeString = ''; - }); - valueTab value = await DBHelper.database.getValue(keyClass.tgl_start); - if(value != null)await prefs.setString(keyClass.lastDownload, value.value); - } - util.showFlushbar(context, result["MSG"]); - Navigator.pop(context); - Navigator.pop(context); + Navigator.pop(context,true); }, ), TextButton( child: Text('Cancel'), - onPressed: ()=>Navigator.pop(context), + onPressed: ()=>Navigator.pop(context,false), ) ], )); + if(isRestore??false){ + var response; + bool isclear; + Directory documentsDirectory = await getExternalStorageDirectory(); + String path = join(documentsDirectory.path, "UnitStocking.db"); + File db = File(path); + if(db.existsSync()){ + isclear = await clearData(context,backup: false); + } + else{ + isclear = true; + } + if(isclear??false){ + var result = await DBHelper.database.restoreDb(); + if(result["STATUS"]==1){ + await prefs.remove(keyClass.lastDownload); + await prefs.remove(keyClass.lastUpload); + await prefs.remove(keyClass.targetProccess); + await prefs.remove(keyClass.submitProccess); + setState(() { + lastUpload = ''; + lastDownload = ''; + timeString = ''; + }); + valueTab value = await DBHelper.database.getValue(keyClass.tgl_start); + if(value != null)await prefs.setString(keyClass.lastDownload, DateFormat('dd-MM-yyyy HH:mm:ss').parse(value.value).toIso8601String()); + else { + await prefs.setString(keyClass.lastDownload, DateTime.now().toIso8601String()); + } + value = await DBHelper.database.getValue(keyClass.stock_id); + if(value != null) await prefs.setString(keyClass.stock_id,value.value); + else { + await prefs.setString(keyClass.stock_id,prefs.getString(keyClass.backup_stock_id)); + } + await prefs.setString(keyClass.cabang_id,prefs.getString(keyClass.backup_cabang_id)); + loadState(); + setState(() { + lastDownload = prefs.getString(keyClass.lastDownload); + }); + } + response = result["MSG"]; + } + if(response != null)util.showFlushbar(context, response); + } } }, ), @@ -803,9 +837,9 @@ class _HomePageState extends State { lastDownload = DateTime.now().toIso8601String(); }); await prefs.setString(keyClass.lastDownload, lastDownload); - await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_START',value: DateFormat('dd-MM-yyyy HH:mm:ss').format(DateTime.parse(lastDownload)))); - await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_STOCK_TAKING',value: DateFormat('dd-MM-yyyy').format(DateTime.parse(lastDownload)))); await DBHelper.database.closeDb(); + await DBHelper.database.insertUpdateValue(new valueTab(name: keyClass.tgl_start,value: DateFormat('dd-MM-yyyy HH:mm:ss').format(DateTime.parse(lastDownload)))); + await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_STOCK_TAKING',value: DateFormat('dd-MM-yyyy').format(DateTime.parse(lastDownload)))); util.showFlushbar(context,'Data downloaded'); loadState(); a.stop(); diff --git a/lib/login_page.dart b/lib/login_page.dart index e213067..40b4aec 100644 --- a/lib/login_page.dart +++ b/lib/login_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'main.dart'; import 'Util/Prefs.dart'; +import 'package:permission_handler/permission_handler.dart' as pHandler; class LoginPage extends StatefulWidget { @@ -23,7 +24,7 @@ class _LoginPageState extends State { Login()async{ util.showLoading(context); var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/'); - if(result['STATUS']==1){ + if(result['STATUS']==1&& result["DATA"]["status"]=='OK'){ prefs.setString(keyClass.loginId, result['DATA'][keyClass.loginId.toLowerCase()]); print("user id ${result['DATA'][keyClass.loginId.toLowerCase()]}"); prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]); @@ -43,10 +44,17 @@ class _LoginPageState extends State { } else{ Navigator.pop(context); - util.showFlushbar(context, result['DATA'],color: Colors.red); + print(result is String); + util.showFlushbar(context, (result['DATA'] is String)?result['DATA']:result['DATA']['info'],color: Colors.red); } } - + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) async { + await util.permissionCheck(context,pHandler.Permission.storage,()async{print("storage permit granted!");},customMessage: " untuk menyimpan data backup"); + }); + super.initState(); + } @override Widget build(BuildContext context) { // if(prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in)){ diff --git a/lib/main.dart b/lib/main.dart index fb42aa0..e4a52e0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,7 +11,6 @@ import 'unit_details.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:location/location.dart'; import 'Util/Util.dart'; -import 'package:flutter_logs/flutter_logs.dart'; SharedPreferences prefs; @@ -56,6 +55,7 @@ void main() async{ // logsExportDirectoryName: "MyLogs/Exported", // debugFileOperations: true, // isDebuggable: true); + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) .then((_) { runApp(new MyApp()); diff --git a/lib/stocking.dart b/lib/stocking.dart index e107310..5aecc86 100644 --- a/lib/stocking.dart +++ b/lib/stocking.dart @@ -198,7 +198,39 @@ class _StockingState extends State with SingleTickerProviderStateMixin child:Stack( children: [ Container( - child: ListView.builder( + alignment: Alignment.topRight, + child: (unitsRef.isEmpty) + ? Container(padding: EdgeInsets.only(top: 10,left: 10,right: 10), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Checkbox( + value: completed, + onChanged: (value)async{ + setState(() { + completed = value; + }); + await loadUnit(); + }, + ), + Text('Completed') + ], + ), + (completed||hideAppbar)?Container():Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text('Unit : ',style: TextStyle(color: Colors.grey,fontSize: 15),), + Text('${(unitsRef.where((element) => element.flag=='TRUE').length==unitsRef.length)?'Done':'${unitsRef.length-unitsRef.where((element) => element.flag=='TRUE').length}'}',style: TextStyle(color: (unitsRef.length==unitsRef.where((element) => element.flag=='TRUE').length)?Colors.green:Colors.black,fontWeight: FontWeight.bold,fontSize: 16),), + Text(!(unitsRef.length==unitsRef.where((element) => element.flag=='TRUE').length)?' of':'',style: TextStyle(color: Colors.grey,fontSize: 15),), + Text(!(unitsRef.length==unitsRef.where((element) => element.flag=='TRUE').length)?' ${unitsRef.length}':'',style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold,),), + ], + ), + ], + ),) + :ListView.builder( padding: EdgeInsets.only(bottom: 10), itemCount: unitsRef.length, shrinkWrap: false, diff --git a/pubspec.lock b/pubspec.lock index db6c3c9..bfe5d2a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.5" + version: "3.2.1" args: dependency: transitive description: @@ -21,14 +21,14 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" barcode_scan2: dependency: "direct main" description: name: barcode_scan2 url: "https://pub.dartlang.org" source: hosted - version: "4.1.4" + version: "4.2.0" boolean_selector: dependency: transitive description: @@ -42,7 +42,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -70,7 +70,7 @@ packages: name: cross_file url: "https://pub.dartlang.org" source: hosted - version: "0.3.1+5" + version: "0.3.2" crypto: dependency: transitive description: @@ -84,7 +84,7 @@ packages: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "1.0.4" fake_async: dependency: transitive description: @@ -138,14 +138,14 @@ packages: name: flutter_logs url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.5" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.5" flutter_test: dependency: "direct dev" description: flutter @@ -176,35 +176,35 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "3.0.8" + version: "3.1.3" image_picker: dependency: "direct main" description: name: image_picker url: "https://pub.dartlang.org" source: hosted - version: "0.8.4+4" + version: "0.8.4+9" image_picker_for_web: dependency: transitive description: name: image_picker_for_web url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.6" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.4.4" in_app_update: dependency: "direct main" description: name: in_app_update url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.0" intl: dependency: "direct main" description: @@ -246,7 +246,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -281,14 +281,14 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.0.9" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" path_provider_ios: dependency: transitive description: @@ -302,35 +302,49 @@ packages: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.5" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.5" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.3" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.5" permission_handler: dependency: "direct main" description: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.2.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.2" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.2" permission_handler_platform_interface: dependency: transitive description: @@ -338,13 +352,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.7.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.3.0" + version: "4.4.0" photo_view: dependency: "direct main" description: @@ -358,21 +379,21 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.2" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" protobuf: dependency: transitive description: @@ -386,35 +407,35 @@ packages: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.13" shared_preferences_android: dependency: transitive description: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" shared_preferences_ios: dependency: transitive description: name: shared_preferences_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.0" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" shared_preferences_platform_interface: dependency: transitive description: @@ -428,14 +449,14 @@ packages: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.0" sky_engine: dependency: transitive description: flutter @@ -454,14 +475,14 @@ packages: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+4" + version: "2.0.2" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.0.1+1" + version: "2.2.0" stack_trace: dependency: transitive description: @@ -503,7 +524,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" typed_data: dependency: transitive description: @@ -517,84 +538,84 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.17" + version: "6.0.20" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.13" + version: "6.0.15" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.13" + version: "6.0.15" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.9" + version: "2.4.1" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.0" + version: "5.3.1" yaml: dependency: transitive description: @@ -603,5 +624,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.15.0 <3.0.0" + flutter: ">=2.8.0" diff --git a/pubspec.yaml b/pubspec.yaml index 0c732fe..f97d10c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: unitstocks description: App to stock Thamrin Brothers Units # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.4+8 +version: 1.0.5+9 environment: sdk: ">=2.1.0 <3.0.0" @@ -13,23 +13,23 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: - image_picker: ^0.8.4+4 + image_picker: ^0.8.4+9 photo_view: ^0.13.0 - sqflite: ^2.0.0+4 - path_provider: ^2.0.7 + sqflite: ^2.0.2 + path_provider: ^2.0.9 flushbar: ^1.10.4 http: ^0.13.4 intl: ^0.17.0 - shared_preferences: ^2.0.9 + shared_preferences: ^2.0.13 location: ^4.3.0 # path: 'local_plugin/location-3.0.2' - permission_handler: ^8.3.0 + permission_handler: ^9.2.0 # app_settings: # autocomplete_textfield: - barcode_scan2: ^4.1.4 + barcode_scan2: ^4.2.0 oauth2: ^2.0.0 - in_app_update: ^2.0.0 - url_launcher: ^6.0.17 + in_app_update: ^3.0.0 + url_launcher: ^6.0.20 package_info: ^2.0.2