瀏覽代碼

backup done

master
jefry 3 年之前
父節點
當前提交
02d8185f95
共有 9 個文件被更改,包括 274 次插入129 次删除
  1. +2
    -0
      android/app/src/main/AndroidManifest.xml
  2. +64
    -19
      lib/Util/DBHelper.dart
  3. +3
    -0
      lib/Util/Prefs.dart
  4. +81
    -47
      lib/home_page.dart
  5. +11
    -3
      lib/login_page.dart
  6. +1
    -1
      lib/main.dart
  7. +33
    -1
      lib/stocking.dart
  8. +70
    -49
      pubspec.lock
  9. +9
    -9
      pubspec.yaml

+ 2
- 0
android/app/src/main/AndroidManifest.xml 查看文件

@@ -8,6 +8,8 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application <application
android:name="io.flutter.app.FlutterApplication" android:name="io.flutter.app.FlutterApplication"
android:label="unitstocks" android:label="unitstocks"


+ 64
- 19
lib/Util/DBHelper.dart 查看文件

@@ -1,11 +1,13 @@
import 'dart:async'; import 'dart:async';
import 'dart:io' as io; import 'dart:io' as io;
import 'dart:typed_data';
import 'UnitModel.dart'; import 'UnitModel.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
import 'Prefs.dart'; import 'Prefs.dart';
import '../main.dart'; import '../main.dart';
import 'package:permission_handler/permission_handler.dart' as pHandler;


class DBHelper { class DBHelper {
DBHelper._(); DBHelper._();
@@ -15,18 +17,45 @@ class DBHelper {


Future<Database> get db async { Future<Database> get db async {
if (_db == null) _db = await initDb(); if (_db == null) _db = await initDb();
return _db;
}
backupDb() async{
try{ 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){ catch(e){
print(e); print(e);
return {"STATUS":0,"MSG":"Backup gagal!"};
} }
return _db;
} }

initDb() async { initDb() async {
io.Directory documentsDirectory = await getExternalStorageDirectory(); io.Directory documentsDirectory = await getExternalStorageDirectory();
String path = join(documentsDirectory.path, "UnitStocking.db"); String path = join(documentsDirectory.path, "UnitStocking.db");
@@ -35,22 +64,37 @@ class DBHelper {
} }


restoreDb()async{ 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 { 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 { _onCreate(Database db, int version) async {
@@ -266,9 +310,11 @@ class DBHelper {
try{ try{
final database = await db; final database = await db;
var res = await database.query(tableName.values,where: "${columnName.name} = ?",whereArgs: [value]); 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); return res.isEmpty?null:valueTab.fromJson(res.first);
} }
catch(e){ catch(e){
print(e);
return null; return null;
} }
} }
@@ -307,7 +353,6 @@ class DBHelper {
newValue.name, newValue.name,
newValue.value newValue.value
]); ]);
print('Row Inserted');
return res; return res;
} }
catch(e){ catch(e){


+ 3
- 0
lib/Util/Prefs.dart 查看文件

@@ -12,6 +12,9 @@ class keyClass{
static String targetProccess = 'dbPath'; static String targetProccess = 'dbPath';
static String submitProccess = 'SUBMIT'; static String submitProccess = 'SUBMIT';
static String stock_id = 'STOCK_TAKING_UNIT_ID'; 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 client_credential = 'CLIENT_CREDENTIAL';
static String rest_data = 'REST_DATA'; static String rest_data = 'REST_DATA';
static String tgl_start = 'TGL_START'; static String tgl_start = 'TGL_START';


+ 81
- 47
lib/home_page.dart 查看文件

@@ -16,6 +16,7 @@ import 'package:intl/intl.dart';
import 'main.dart'; import 'main.dart';
import 'Util/Prefs.dart'; import 'Util/Prefs.dart';
import 'Util/UnitModel.dart'; import 'Util/UnitModel.dart';
import 'package:permission_handler/permission_handler.dart' as pHandler;


class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
// HomePage({Key key}) : super(key: key); // HomePage({Key key}) : super(key: key);
@@ -36,7 +37,7 @@ class _HomePageState extends State<HomePage> {
String state = ''; String state = '';
final hostAddress = new TextEditingController(); final hostAddress = new TextEditingController();


clearData(context)async{
clearData(context,{backup=true})async{
setState(() { setState(() {
progressDL = null; progressDL = null;
isLoading = false; isLoading = false;
@@ -56,40 +57,31 @@ class _HomePageState extends State<HomePage> {
onPressed: ()async{ onPressed: ()async{
util.showLoading(context); util.showLoading(context);
await Future.sync(()async{ 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{ try{
Directory documentsDirectory = await getExternalStorageDirectory(); Directory documentsDirectory = await getExternalStorageDirectory();
String path = join(documentsDirectory.path, "UnitStocking.db"); String path = join(documentsDirectory.path, "UnitStocking.db");
File db = File(path); File db = File(path);
if(db.existsSync()){ if(db.existsSync()){
await DBHelper.database.closeDb();
//auto backup
// if(backup)await DBHelper.database.backupDb(context);
db.deleteSync(); 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){ catch(e){
print(e); print(e);
util.showFlushbar(context, 'Failed to delete database file',color: Colors.red); 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);
Navigator.pop(context,true); Navigator.pop(context,true);
@@ -133,6 +125,7 @@ class _HomePageState extends State<HomePage> {
lastUpload = prefs.getString(keyClass.lastUpload)??''; lastUpload = prefs.getString(keyClass.lastUpload)??'';
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
await _check_Update(); 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<HomePage> {
), ),
), ),
PopupMenuItem( PopupMenuItem(
value:'backup',
child: Row(
children: <Widget>[
Icon(Icons.save,color: Colors.black,),
SizedBox(width: 10,),
Text('Backup Data')
],
),
),
PopupMenuItem(
value:'restore', value:'restore',
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
Icon(Icons.sync,color: Colors.black,), Icon(Icons.sync,color: Colors.black,),
SizedBox(width: 10,), SizedBox(width: 10,),
Text('Restore Backup')
Text('Restore Data')
], ],
), ),
), ),
@@ -670,40 +673,71 @@ class _HomePageState extends State<HomePage> {
prefs.setBool(keyClass.logged_in, false); prefs.setBool(keyClass.logged_in, false);
Navigator.pushNamed(context, '/login'); 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'){ if(value == 'restore'){
await showDialog(context: context,builder: (context)=>AlertDialog(
bool isRestore = await showDialog(context: context,builder: (context)=>AlertDialog(
title: Text('Restore Data ?'), 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: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: Text('Proceed'), child: Text('Proceed'),
onPressed: ()async{ 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( TextButton(
child: Text('Cancel'), 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<HomePage> {
lastDownload = DateTime.now().toIso8601String(); lastDownload = DateTime.now().toIso8601String();
}); });
await prefs.setString(keyClass.lastDownload, lastDownload); 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.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'); util.showFlushbar(context,'Data downloaded');
loadState(); loadState();
a.stop(); a.stop();


+ 11
- 3
lib/login_page.dart 查看文件

@@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'main.dart'; import 'main.dart';
import 'Util/Prefs.dart'; import 'Util/Prefs.dart';
import 'package:permission_handler/permission_handler.dart' as pHandler;




class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
@@ -23,7 +24,7 @@ class _LoginPageState extends State<LoginPage> {
Login()async{ Login()async{
util.showLoading(context); util.showLoading(context);
var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/'); 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()]); prefs.setString(keyClass.loginId, result['DATA'][keyClass.loginId.toLowerCase()]);
print("user id ${result['DATA'][keyClass.loginId.toLowerCase()]}"); print("user id ${result['DATA'][keyClass.loginId.toLowerCase()]}");
prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]); prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]);
@@ -43,10 +44,17 @@ class _LoginPageState extends State<LoginPage> {
} }
else{ else{
Navigator.pop(context); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// if(prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in)){ // if(prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in)){


+ 1
- 1
lib/main.dart 查看文件

@@ -11,7 +11,6 @@ import 'unit_details.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:location/location.dart'; import 'package:location/location.dart';
import 'Util/Util.dart'; import 'Util/Util.dart';
import 'package:flutter_logs/flutter_logs.dart';




SharedPreferences prefs; SharedPreferences prefs;
@@ -56,6 +55,7 @@ void main() async{
// logsExportDirectoryName: "MyLogs/Exported", // logsExportDirectoryName: "MyLogs/Exported",
// debugFileOperations: true, // debugFileOperations: true,
// isDebuggable: true); // isDebuggable: true);

SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) { .then((_) {
runApp(new MyApp()); runApp(new MyApp());


+ 33
- 1
lib/stocking.dart 查看文件

@@ -198,7 +198,39 @@ class _StockingState extends State<Stocking> with SingleTickerProviderStateMixin
child:Stack( child:Stack(
children: <Widget>[ children: <Widget>[
Container( 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: <Widget>[
Row(
children: <Widget>[
Checkbox(
value: completed,
onChanged: (value)async{
setState(() {
completed = value;
});
await loadUnit();
},
),
Text('Completed')
],
),
(completed||hideAppbar)?Container():Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
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), padding: EdgeInsets.only(bottom: 10),
itemCount: unitsRef.length, itemCount: unitsRef.length,
shrinkWrap: false, shrinkWrap: false,


+ 70
- 49
pubspec.lock 查看文件

@@ -7,7 +7,7 @@ packages:
name: archive name: archive
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.5"
version: "3.2.1"
args: args:
dependency: transitive dependency: transitive
description: description:
@@ -21,14 +21,14 @@ packages:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.1"
version: "2.8.2"
barcode_scan2: barcode_scan2:
dependency: "direct main" dependency: "direct main"
description: description:
name: barcode_scan2 name: barcode_scan2
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.4"
version: "4.2.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@@ -42,7 +42,7 @@ packages:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0"
version: "1.2.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@@ -70,7 +70,7 @@ packages:
name: cross_file name: cross_file
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.1+5"
version: "0.3.2"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@@ -84,7 +84,7 @@ packages:
name: cupertino_icons name: cupertino_icons
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3"
version: "1.0.4"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -138,14 +138,14 @@ packages:
name: flutter_logs name: flutter_logs
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.4"
version: "2.1.5"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3"
version: "2.0.5"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -176,35 +176,35 @@ packages:
name: image name: image
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.8"
version: "3.1.3"
image_picker: image_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: image_picker name: image_picker
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.4+4"
version: "0.8.4+9"
image_picker_for_web: image_picker_for_web:
dependency: transitive dependency: transitive
description: description:
name: image_picker_for_web name: image_picker_for_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.3"
version: "2.1.6"
image_picker_platform_interface: image_picker_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: image_picker_platform_interface name: image_picker_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.4.1"
version: "2.4.4"
in_app_update: in_app_update:
dependency: "direct main" dependency: "direct main"
description: description:
name: in_app_update name: in_app_update
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0"
version: "3.0.0"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -246,7 +246,7 @@ packages:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10"
version: "0.12.11"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -281,14 +281,14 @@ packages:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.7"
version: "2.0.9"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9"
version: "2.0.11"
path_provider_ios: path_provider_ios:
dependency: transitive dependency: transitive
description: description:
@@ -302,35 +302,49 @@ packages:
name: path_provider_linux name: path_provider_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0"
version: "2.1.5"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
name: path_provider_macos name: path_provider_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.0.5"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1"
version: "2.0.3"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3"
version: "2.0.5"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
name: permission_handler name: permission_handler
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted 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: permission_handler_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -338,13 +352,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.7.0" 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: petitparser:
dependency: transitive dependency: transitive
description: description:
name: petitparser name: petitparser
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.3.0"
version: "4.4.0"
photo_view: photo_view:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -358,21 +379,21 @@ packages:
name: platform name: platform
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.2"
version: "3.1.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.1.2"
process: process:
dependency: transitive dependency: transitive
description: description:
name: process name: process
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.3"
version: "4.2.4"
protobuf: protobuf:
dependency: transitive dependency: transitive
description: description:
@@ -386,35 +407,35 @@ packages:
name: shared_preferences name: shared_preferences
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9"
version: "2.0.13"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_android name: shared_preferences_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9"
version: "2.0.11"
shared_preferences_ios: shared_preferences_ios:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_ios name: shared_preferences_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.8"
version: "2.1.0"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_linux name: shared_preferences_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.1.0"
shared_preferences_macos: shared_preferences_macos:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_macos name: shared_preferences_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.0.3"
shared_preferences_platform_interface: shared_preferences_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -428,14 +449,14 @@ packages:
name: shared_preferences_web name: shared_preferences_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.0.3"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_windows name: shared_preferences_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "2.1.0"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -454,14 +475,14 @@ packages:
name: sqflite name: sqflite
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0+4"
version: "2.0.2"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1+1"
version: "2.2.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -503,7 +524,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.2"
version: "0.4.3"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@@ -517,84 +538,84 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.17"
version: "6.0.20"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.13"
version: "6.0.15"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_ios name: url_launcher_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.13"
version: "6.0.15"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "3.0.0"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "3.0.0"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4"
version: "2.0.5"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5"
version: "2.0.6"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2"
version: "3.0.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0"
version: "2.1.1"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.9"
version: "2.4.1"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0"
version: "0.2.0+1"
xml: xml:
dependency: transitive dependency: transitive
description: description:
name: xml name: xml
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.3.0"
version: "5.3.1"
yaml: yaml:
dependency: transitive dependency: transitive
description: description:
@@ -603,5 +624,5 @@ packages:
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
sdks: sdks:
dart: ">=2.14.0 <3.0.0"
flutter: ">=2.5.0"
dart: ">=2.15.0 <3.0.0"
flutter: ">=2.8.0"

+ 9
- 9
pubspec.yaml 查看文件

@@ -1,7 +1,7 @@
name: unitstocks name: unitstocks
description: App to stock Thamrin Brothers Units description: App to stock Thamrin Brothers Units
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.4+8
version: 1.0.5+9


environment: environment:
sdk: ">=2.1.0 <3.0.0" sdk: ">=2.1.0 <3.0.0"
@@ -13,23 +13,23 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: cupertino_icons:
image_picker: ^0.8.4+4
image_picker: ^0.8.4+9
photo_view: ^0.13.0 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 flushbar: ^1.10.4
http: ^0.13.4 http: ^0.13.4
intl: ^0.17.0 intl: ^0.17.0
shared_preferences: ^2.0.9
shared_preferences: ^2.0.13
location: ^4.3.0 location: ^4.3.0
# path: 'local_plugin/location-3.0.2' # path: 'local_plugin/location-3.0.2'
permission_handler: ^8.3.0
permission_handler: ^9.2.0
# app_settings: # app_settings:
# autocomplete_textfield: # autocomplete_textfield:
barcode_scan2: ^4.1.4
barcode_scan2: ^4.2.0
oauth2: ^2.0.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 package_info: ^2.0.2






Loading…
取消
儲存