Browse Source

v7 push

master
jefry 3 years ago
parent
commit
2ecac047e5
17 changed files with 449 additions and 93 deletions
  1. +10
    -3
      android/app/build.gradle
  2. +1
    -0
      android/gradle.properties
  3. +1
    -0
      ios/Flutter/Debug.xcconfig
  4. +1
    -0
      ios/Flutter/Release.xcconfig
  5. +41
    -0
      ios/Podfile
  6. +1
    -1
      lib/Util/DBHelper.dart
  7. +1
    -0
      lib/Util/Prefs.dart
  8. +5
    -1
      lib/Util/UnitModel.dart
  9. +118
    -1
      lib/Util/Util.dart
  10. +50
    -33
      lib/Util/download_Upload_Handler.dart
  11. +63
    -3
      lib/home_page.dart
  12. +1
    -1
      lib/login_page.dart
  13. +16
    -0
      lib/main.dart
  14. +1
    -4
      lib/stocking.dart
  15. +17
    -33
      lib/unit_details.dart
  16. +113
    -8
      pubspec.lock
  17. +9
    -5
      pubspec.yaml

+ 10
- 3
android/app/build.gradle View File

@@ -28,14 +28,21 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.8.0'
if (osdetector.os == "osx") {
artifact = 'com.google.protobuf:protoc:3.19.1:osx-x86_64'
} else {
artifact = 'com.google.protobuf:protoc:3.19.1'
}
// artifact = 'com.google.protobuf:protoc:3.8.0'
}
plugins {
javalite {
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
if (osdetector.os != "osx"){
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
artifact = 'io.grpc:protoc-gen-grpc-java:1.42.1'
}
}
generateProtoTasks {


+ 1
- 0
android/gradle.properties View File

@@ -2,3 +2,4 @@ org.gradle.jvmargs=-Xmx5120M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true


+ 1
- 0
ios/Flutter/Debug.xcconfig View File

@@ -1 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

+ 1
- 0
ios/Flutter/Release.xcconfig View File

@@ -1 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

+ 41
- 0
ios/Podfile View File

@@ -0,0 +1,41 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}

def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end

File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
use_frameworks!
use_modular_headers!

flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

+ 1
- 1
lib/Util/DBHelper.dart View File

@@ -81,7 +81,7 @@ class DBHelper {
}

Future<List<Unit>> searchAllUnits(String query,{inserted:false}) async {
print("${(inserted)?"${columnName.flag} = 'TRUE' AND ":''} REPLACE(${columnName.mesin},'-','') like '%$query%' or ${columnName.rangka} like '%$query%' or ${columnName.mesin} like '%$query%' or ${columnName.timestamp} like '%$query%' or ${columnName.tipe} like '%$query%' or ${columnName.warna} like '%$query%' or UPPER(${columnName.state}) like '%$query%'");
// print("${(inserted)?"${columnName.flag} = 'TRUE' AND ":''} REPLACE(${columnName.mesin},'-','') like '%$query%' or ${columnName.rangka} like '%$query%' or ${columnName.mesin} like '%$query%' or ${columnName.timestamp} like '%$query%' or ${columnName.tipe} like '%$query%' or ${columnName.warna} like '%$query%' or UPPER(${columnName.state}) like '%$query%'");
final database = await db;
try{
var res = await database.query(tableName.master,where: "${(inserted)?"${columnName.flag} = 'TRUE' AND ":''} (REPLACE(${columnName.mesin},'-','') like '%$query%' or ${columnName.rangka} like '%$query%' or ${columnName.mesin} like '%$query%' or ${columnName.timestamp} like '%$query%' or ${columnName.tipe} like '%$query%' or ${columnName.warna} like '%$query%' or UPPER(${columnName.state}) like '%$query%')",orderBy: "CASE WHEN ${columnName.flag} = 'FALSE' THEN 0 ELSE 1 END, ${columnName.state} desc");


+ 1
- 0
lib/Util/Prefs.dart View File

@@ -35,6 +35,7 @@ class columnName{
static String state = 'STATE';
static String no_urut = 'NO_URUT';
static String flag = 'FLAG_INSERT';
static String channel = "CHANNEL";
}
class tableName{
static String master = 'refTable';


+ 5
- 1
lib/Util/UnitModel.dart View File

@@ -12,6 +12,7 @@ class Unit {
String state;
String flag;
String timestamp;
String channel;


Unit({
@@ -25,6 +26,7 @@ class Unit {
this.state,
this.flag,
this.timestamp,
this.channel,
});

factory Unit.fromJson(Map<String, dynamic> json) {
@@ -38,7 +40,8 @@ class Unit {
warna : json[columnName.warna],
state: json[columnName.state],
flag: json[columnName.flag],
timestamp: json[columnName.timestamp]??''
timestamp: json[columnName.timestamp]??'',
channel: json[columnName.channel],
);}

Map<String, dynamic> toJson() => {
@@ -52,6 +55,7 @@ class Unit {
columnName.state :state,
columnName.flag :flag,
columnName.timestamp :timestamp,
columnName.channel:channel,
};
}



+ 118
- 1
lib/Util/Util.dart View File

@@ -5,16 +5,74 @@ import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:flushbar/flushbar.dart';
import 'package:http/io_client.dart';
import 'package:in_app_update/in_app_update.dart';
import 'package:url_launcher/url_launcher.dart';
import '../main.dart';
import 'package:location/location.dart';
import 'package:permission_handler/permission_handler.dart' as pHandler;
import 'Prefs.dart';
import 'package:oauth2/oauth2.dart' as oauth2;
// import 'package:flutter_logs/flutter_logs.dart';

class Util{
bool tokenValidity = true;
bool useLocal = false;

getMinAppVer()async{
var req = await JsonDataGetRaw(null,'${prefs.getString(keyClass.hostAddress)}/app/min_ver/');
return req;
}

launchURL(String url) async {
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}

updateDialog(context)async{
WidgetsBinding.instance.addPostFrameCallback((_) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: (){
return null;
},
child: AlertDialog(
title: Text('App version is too old'),
content: Text('Please update the application'),
actions: <Widget>[
TextButton(
child: Text('Update',style: TextStyle(color: Colors.blue),),
onPressed: ()async{
try{
AppUpdateInfo _updateInfo;

_updateInfo = await InAppUpdate.checkForUpdate();
if(_updateInfo?.updateAvailability == 2){
await InAppUpdate.performImmediateUpdate();
}
else throw {"message":"manual Update"};
// util.showFlushbar(context, "${_updateInfo?.updateAvailable}");
}
catch(e){
await Future.delayed(Duration(milliseconds: 500));
await launchURL('https://play.google.com/store/apps/details?id=com.thamringroup.unitstocks');
// util.showFlushbar(context, "Failed checking updates. $e.");
}
},
),
],
),
);
},
barrierDismissible: false,
);
});
}

getOauth2Client() async {
bool resetClient = false;
oauth2.Credentials restData = (prefs.getString(keyClass.rest_data)!=null&&prefs.getString(keyClass.rest_data).contains("accessToken"))?oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)):null;
@@ -101,6 +159,64 @@ class Util{
}
}

JsonDataGetRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
var httpClient;
const JsonDecoder decoder = const JsonDecoder();
var headers = {'Content-type': 'application/json'};
try {
var response;
if(secure) {
httpClient = await getOauth2Client();
oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
headers["Authorization"] =
"bearer ${tokenRestData.accessToken}";
}
else {
httpClient = http;
}
if(jsonData!= null&&jsonData.length!=0) {
url = url + '?';
for (var i in jsonData.keys) {
url = url + i + '=' + jsonData[i] + '&';
}
url = url.substring(0, url.length - 1);
}
if (timeout)
response = await httpClient.get(
Uri.parse(url), headers: headers,
).timeout(const Duration(seconds: 10));
else
response = await httpClient.get(
Uri.parse(url), headers: {'Content-type': 'application/json'},
);
if(response.statusCode == 403) tokenValidity = false;
if(htmlErrorTitle(response.body.toString())!=""){
return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
}
final Map data = decoder.convert(response.body);
try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
return data;
} on TimeoutException catch(e){
return {"STATUS":0,"DATA":"Request Timeout"};
}
on HandshakeException catch(e){
if(useLocal){
return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
}
else{
useLocal = true;
http = IOClient(HttpClient(context: clientContext));
return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
}

}
on Exception catch(exception){
print(url);
// Toast("Not Connected to Server", Colors.red);
return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
}
}

JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
var httpClient;
const JsonDecoder decoder = const JsonDecoder();
@@ -154,12 +270,13 @@ class Util{
}

htmlErrorTitle(String html){
// FlutterLogs.logInfo("TAG", "subTag", html);
try{
if(html.contains('<title>')) {
String titleElement = html.substring(html.indexOf("<title>")+7,html.indexOf("<\/title>"));
return titleElement;
}
else return '';
return '';
}
catch(e){
return '';


+ 50
- 33
lib/Util/download_Upload_Handler.dart View File

@@ -20,16 +20,25 @@ class file_Trans_Handler {
StreamController _progress = new StreamController<double>();
Stream<double> get progress =>_progress.stream;
bool useLocal = false;
var httpClient;
Client httpClient;

downloadFile(String fileName,String link) async {
StreamedResponse _response;
List<int> _bytes = [];
int _total = 0;
httpClient = await util.getOauth2Client();
print('Start Download');
print('Start Download $link');
_progress.add(null);
try {
void mainThrow(e){
cancel();
_progress.add(-1.0);
if(util.htmlErrorTitle(e.message??e)!=""){
_error = util.htmlErrorTitle(e.message??e);
}
else _error = e.message??e;
// print("mainthrow $_error");
}

Request req = new Request('GET', Uri.parse(link));
// req.headers = '';
@@ -48,38 +57,42 @@ class file_Trans_Handler {
_progress.add(((_bytes.length / _total)));
}
else{
// print("masuk error");
// this.cancel();
// cancel(); //stop stream
String resString = utf8.decode(value);
if(util.htmlErrorTitle(resString)!=""){
_error = util.htmlErrorTitle(resString);
}
_error = resString;
// if(util.htmlErrorTitle(resString)!=""){
// _error = util.htmlErrorTitle(resString);
// }
// else
// _error = resString;
mainThrow(Exception(resString));
}
})
..onDone(() async {
if(_error==''){
_progress.add(0.0);
print('Finish Download');
final file = File(
"${(await getApplicationDocumentsDirectory()).path}/$fileName");
await file.writeAsBytes(_bytes);
_path = file.path;
}
else{
print('Error Download, $_error');
_progress.add(-1.0);
}
})
..onError((e) async {
print('Error Download, $e');
_progress.add(-1.0);
_error = e.toString();
});
},onDone:() async {
if(_error==''){
_progress.add(0.0);
print('Finish Download');
final file = File(
"${(await getApplicationDocumentsDirectory()).path}/$fileName");
await file.writeAsBytes(_bytes);
_path = file.path;
}
else{
mainThrow(_error);
}
} ,onError: (e) async {
mainThrow(e);
},cancelOnError: true);
}
on HandshakeException catch(e){
cancel();
if(useLocal){
print('Error Download, $e');
// print('Error Download 3, $e');
_progress.add(-1.0);
_error = e.toString();
if(util.htmlErrorTitle(e.message ?? e)!=""){
_error = util.htmlErrorTitle(e.message ?? e);
}
else _error = e.toString();
}
else{
useLocal = true;
@@ -88,9 +101,12 @@ class file_Trans_Handler {
}
}
catch(e){
print('Error Download, $e');
cancel();
_progress.add(-1.0);
_error = e.toString();
if(util.htmlErrorTitle(e.message??e)!=""){
_error = util.htmlErrorTitle(e.message??e);
}
else _error = e.toString();
}
}

@@ -102,11 +118,12 @@ class file_Trans_Handler {
String mimeType = 'application/vnd.sqlite3';
if(file.existsSync()){
Uint8List byte = file.readAsBytesSync();
// print("file size ${file.lengthSync()/1024}");
try{
var _response = await httpClient.put(
Uri.parse(link), headers: {"cabangId":cabang_id,"company":company,'Content-type': mimeType,'Authorization':'Bearer ${tokenRestData.accessToken}'},
body: byte);
body: byte).onError((error, stackTrace){
return new Response("Internal Server Error", 400);
});
print('File send ${file.lengthSync()/1024} KB');
if(_response.statusCode!=200){
if(util.htmlErrorTitle(_response.body.toString())!=""){
@@ -241,7 +258,7 @@ class file_Trans_Handler {
}

cancel()async{
http?.close();
// http?.close();
await dlulStream?.cancel();
_progress?.close();
}

+ 63
- 3
lib/home_page.dart View File

@@ -1,7 +1,10 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:in_app_update/in_app_update.dart';
import 'package:package_info/package_info.dart';
import 'package:path/path.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -108,7 +111,7 @@ class _HomePageState extends State<HomePage> {
if(prefs.getString(keyClass.stock_id) == null)
{
valueTab value = await DBHelper.database.getValue(keyClass.stock_id);
await prefs.setString(keyClass.stock_id, value.value);
if(value != null)await prefs.setString(keyClass.stock_id, value.value);
}
String stock_taking_id = prefs.getString(keyClass.stock_id);
if(company!=null&&stock_taking_id!=null){
@@ -128,6 +131,63 @@ class _HomePageState extends State<HomePage> {
loadState();
lastDownload = prefs.getString(keyClass.lastDownload)??'';
lastUpload = prefs.getString(keyClass.lastUpload)??'';
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _check_Update();
});
}

_check_Update()async{
if(defaultTargetPlatform == TargetPlatform.android){
try{
final PackageInfo info = await PackageInfo.fromPlatform();
AppUpdateInfo _updateInfo = await InAppUpdate.checkForUpdate();

String currentVersion = info.version.trim();
String latestversion = '0.0.0';
var result = await util.getMinAppVer();
if(result['STATUS']==1){
latestversion = result['DATA'];
}
var current = currentVersion.split('.');
var latest = latestversion.split('.');
if(int.parse(current[0])==int.parse(latest[0])){
if(int.parse(current[1])==int.parse(latest[1])){
if(int.parse(current[2])<int.parse(latest[2])) {
await util.updateDialog(context);
}
else{
if(_updateInfo?.updateAvailability == 2) {
await InAppUpdate.startFlexibleUpdate();
await InAppUpdate.completeFlexibleUpdate();
}
}
}
else if(int.parse(current[1])<int.parse(latest[1])) {
await util.updateDialog(context);
// await InAppUpdate.performImmediateUpdate();
}
else{
if(_updateInfo?.updateAvailability == 2) {
await InAppUpdate.startFlexibleUpdate();
await InAppUpdate.completeFlexibleUpdate();
}
}
}
else if(int.parse(current[0])<int.parse(latest[0])) {
await util.updateDialog(context);
// await InAppUpdate.performImmediateUpdate();
}
else{
if(_updateInfo?.updateAvailability == 2 ) {
await InAppUpdate.startFlexibleUpdate();
await InAppUpdate.completeFlexibleUpdate();
}
}
}
catch(e){
print("error Update $e");
}
}
}

changeCabang(context)async{
@@ -715,7 +775,7 @@ class _HomePageState extends State<HomePage> {
setState(() {
isLoading = false;
});
util.showFlushbar(context,'Data download error',color: Colors.red);
util.showFlushbar(context,trans.error??'Data download error',color: Colors.red);
}
});
// Navigator.popUntil(context, ModalRoute.withName('/home'));
@@ -930,7 +990,7 @@ class _HomePageState extends State<HomePage> {
));
if(result){
util.showLoading(context);
var unpack = await util.JsonDataPutRaw({"cabangId":prefs.getString(keyClass.cabang_id),"company":prefs.getString(keyClass.company),"dbPath":prefs.getString(keyClass.targetProccess)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/add_collection/');
var unpack = await util.JsonDataPutRaw({"userId":prefs.getString(keyClass.loginId),"cabangId":prefs.getString(keyClass.cabang_id),"company":prefs.getString(keyClass.company),"dbPath":prefs.getString(keyClass.targetProccess)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/add_collection/');
Navigator.pop(context);
util.showFlushbar(context, unpack['DATA'],color:(unpack['STATUS']!=1)?Colors.red:Colors.grey);
if(unpack['STATUS']==1){


+ 1
- 1
lib/login_page.dart View File

@@ -25,13 +25,13 @@ class _LoginPageState extends State<LoginPage> {
var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/');
if(result['STATUS']==1){
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()]);
prefs.setBool(keyClass.logged_in, true);
var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/');
Navigator.pop(context);
if(cabangList['STATUS']==1){
cabangDrop = cabangList['DATA'];
print(cabangList);
selected = cabangDrop[0]['RETURN_VALUE'];
setState(() {
});


+ 16
- 0
lib/main.dart View File

@@ -11,6 +11,7 @@ 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;
@@ -33,6 +34,21 @@ void main() async{
await registerCert();
if( prefs.getString(keyClass.hostAddress) ==null)await prefs.setString(keyClass.hostAddress, "https://tbg.thamringroup.web.id/ords/tbs/unit/v1");
await prefs.setString(keyClass.restTokenAddress, "https://tbg.thamringroup.web.id/ords/tbs/oauth/token");
await FlutterLogs.initLogs(
logLevelsEnabled: [
LogLevel.INFO,
LogLevel.WARNING,
LogLevel.ERROR,
LogLevel.SEVERE
],
timeStampFormat: TimeStampFormat.TIME_FORMAT_READABLE,
directoryStructure: DirectoryStructure.FOR_DATE,
logTypesEnabled: ["device","network","errors"],
logFileExtension: LogFileExtension.LOG,
logsWriteDirectoryName: "MyLogs",
logsExportDirectoryName: "MyLogs/Exported",
debugFileOperations: true,
isDebuggable: true);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) {
runApp(new MyApp());


+ 1
- 4
lib/stocking.dart View File

@@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/services.dart';

import 'main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -10,7 +9,7 @@ import 'Util/DBHelper.dart';
import 'Util/UnitModel.dart';
import 'Util/Util.dart';
import 'Util/photo_viewer.dart';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:barcode_scan2/barcode_scan2.dart';

class Stocking extends StatefulWidget {
Stocking({Key key}) : super(key: key);
@@ -20,7 +19,6 @@ class Stocking extends StatefulWidget {
}

class _StockingState extends State<Stocking> with SingleTickerProviderStateMixin {
// List<insertUnit> Units = [];
List<Unit> unitsRef = [];
List<blobImage> Blobs = [];
List<blobImage> BlobsRef = [];
@@ -28,7 +26,6 @@ class _StockingState extends State<Stocking> with SingleTickerProviderStateMixin
Util util = new Util();
int totalUnit = 0;
final search_controller = new TextEditingController();
// TabController _tabBarcontroller;
bool hideAppbar = false;
String search = '';



+ 17
- 33
lib/unit_details.dart View File

@@ -24,6 +24,7 @@ class _UnitDetailsState extends State<UnitDetails> {
final mesinController = TextEditingController();
final tahunController = TextEditingController();
final stateController = TextEditingController();
final channelController = TextEditingController();

// insertUnit _unitDetails;
bool isChanged = false;
@@ -39,37 +40,6 @@ class _UnitDetailsState extends State<UnitDetails> {
// List<Unit> allUnits = [];

loadUnitDetails(context)async{
// if(widget.idInsert!=null){
//// var result = await DBHelper.database.getInsertUnit(widget.idInsert);
//// if(result!=null){
//// _unitDetails = result;
//// mesinController.text = _unitDetails.mesin;
//// tipeController.text= _unitDetails.tipe;
//// rangkaController.text = _unitDetails.rangka;
//// colorController.text = _unitDetails.warna;
//// tahunController.text = _unitDetails.tahun;
//// kodeController.text = _unitDetails.kode;
//// stateController.text = _unitDetails.state;
////
//// result = await DBHelper.database.getAllBlobImage(_unitDetails.id);
//// if(result!=null){
//// for(int i =0; i<result.length;i++){
//// images.add(result[i].blob_file);
//// blobIds.add(result[i].blob_id);
//// jenisImages.add(result[i].jenis);
//// }
//// }
//// setState(() {
//// });
//// }
//// else{
//// util.showFlushbar(context, 'Unit can\'t be found');
//// }
// await DBHelper.database.closeDb();
// }
// else{
// var result = await DBHelper.database.getUnitdetailMaster(widget.idRef);
// if (result!=null){
_currentUnit = widget.unit;
tipeController.text= _currentUnit.tipe;
rangkaController.text = _currentUnit.rangka;
@@ -78,8 +48,7 @@ class _UnitDetailsState extends State<UnitDetails> {
mesinController.text = _currentUnit.mesin;
tahunController.text = _currentUnit.tahun;
stateController.text = _currentUnit.state;
// }
// }
channelController.text = (_currentUnit.channel==null||_currentUnit.channel==""||_currentUnit.channel=="null")?'-':_currentUnit.channel;
await loadBlob();
}
// loadTipe() async{
@@ -606,6 +575,21 @@ class _UnitDetailsState extends State<UnitDetails> {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('Channel : '),
Expanded(
child: TextFormField(
enabled: false,
style: TextStyle(color: Colors.grey),
controller: channelController,
decoration: InputDecoration.collapsed(hintText: null),
),
),
],
),
Divider(),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,


+ 113
- 8
pubspec.lock View File

@@ -22,13 +22,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.1"
barcode_scan:
barcode_scan2:
dependency: "direct main"
description:
name: barcode_scan
name: barcode_scan2
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
version: "4.1.4"
boolean_selector:
dependency: transitive
description:
@@ -112,7 +112,7 @@ packages:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "0.10.11"
version: "1.0.0"
flushbar:
dependency: "direct main"
description:
@@ -132,6 +132,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.9.2"
flutter_logs:
dependency: "direct dev"
description:
name: flutter_logs
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
@@ -176,7 +183,7 @@ packages:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.4+2"
version: "0.8.4+4"
image_picker_for_web:
dependency: transitive
description:
@@ -191,6 +198,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.1"
in_app_update:
dependency: "direct main"
description:
name: in_app_update
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
intl:
dependency: "direct main"
description:
@@ -247,6 +261,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
package_info:
dependency: "direct main"
description:
name: package_info
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
path:
dependency: transitive
description:
@@ -260,7 +281,21 @@ packages:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
version: "2.0.7"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.9"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
path_provider_linux:
dependency: transitive
description:
@@ -295,7 +330,7 @@ packages:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
version: "8.2.2"
version: "8.3.0"
permission_handler_platform_interface:
dependency: transitive
description:
@@ -344,13 +379,27 @@ packages:
name: protobuf
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "2.0.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.9"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.9"
shared_preferences_ios:
dependency: transitive
description:
name: shared_preferences_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.8"
shared_preferences_linux:
dependency: transitive
@@ -462,6 +511,62 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.17"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.13"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.13"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.4"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
vector_math:
dependency: transitive
description:


+ 9
- 5
pubspec.yaml View File

@@ -13,24 +13,28 @@ 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+2
image_picker: ^0.8.4+4
photo_view: ^0.13.0
sqflite: ^2.0.0+4
path_provider: ^2.0.5
path_provider: ^2.0.7
flushbar: ^1.10.4
http: ^0.13.4
intl: ^0.17.0
shared_preferences: ^2.0.8
shared_preferences: ^2.0.9
location: ^4.3.0
# path: 'local_plugin/location-3.0.2'
permission_handler: ^8.2.2
permission_handler: ^8.3.0
# app_settings:
# autocomplete_textfield:
barcode_scan: ^3.0.1
barcode_scan2: ^4.1.4
oauth2: ^2.0.0
in_app_update: ^2.0.0
url_launcher: ^6.0.17
package_info: ^2.0.2


dev_dependencies:
flutter_logs:
flutter_launcher_icons:
flutter_test:
sdk: flutter


Loading…
Cancel
Save