flutter app untuk unitstock
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

381 regels
19 KiB

  1. import 'dart:async';
  2. import 'dart:typed_data';
  3. import 'package:flutter/services.dart';
  4. import 'main.dart';
  5. import 'package:flutter/cupertino.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:unitstocks/unit_details.dart';
  8. import 'Util/DBHelper.dart';
  9. import 'Util/UnitModel.dart';
  10. import 'Util/Util.dart';
  11. import 'Util/photo_viewer.dart';
  12. import 'package:barcode_scan/barcode_scan.dart';
  13. class Stocking extends StatefulWidget {
  14. Stocking({Key key}) : super(key: key);
  15. @override
  16. _StockingState createState() => _StockingState();
  17. }
  18. class _StockingState extends State<Stocking> with SingleTickerProviderStateMixin {
  19. // List<insertUnit> Units = [];
  20. List<Unit> unitsRef = [];
  21. List<blobImage> Blobs = [];
  22. List<blobImage> BlobsRef = [];
  23. bool completed = false;
  24. Util util = new Util();
  25. int totalUnit = 0;
  26. final search_controller = new TextEditingController();
  27. // TabController _tabBarcontroller;
  28. bool hideAppbar = false;
  29. String search = '';
  30. loadUnit()async{
  31. print('loading units');
  32. Blobs.clear();
  33. BlobsRef.clear();
  34. await DBHelper.database.closeDb();
  35. // Units = (search=='')?await DBHelper.database.getAllInsertUnits():await DBHelper.database.searchAllInsertUnits(search.toUpperCase());
  36. unitsRef = (search=='')?await DBHelper.database.getAllUnits(inserted: completed):await DBHelper.database.searchAllUnits(search.toUpperCase(),inserted: completed);
  37. // totalUnit = await DBHelper.database.getCount();
  38. // for (int i = 0;i<Units.length;i++){
  39. // var blob = await DBHelper.database.getBlobImage(Units[i].id);
  40. // Blobs.add(blob);
  41. // }
  42. for (int i = 0;i<unitsRef.length;i++){
  43. var blob = (unitsRef[i].mesin!=null)?await DBHelper.database.getBlobImage(unitsRef[i].mesin):null;
  44. BlobsRef.add(blob);
  45. }
  46. print([BlobsRef.length,unitsRef.length]);
  47. setState(() {
  48. });
  49. }
  50. Map<Function, Timer> _timeouts = {};
  51. void debounce(Duration timeout, Function target, [List arguments = const []]) {
  52. if (_timeouts.containsKey(target)) {
  53. _timeouts[target].cancel();
  54. }
  55. Timer timer = Timer(timeout, () {
  56. Function.apply(target, arguments);
  57. });
  58. _timeouts[target] = timer;
  59. }
  60. void _onChanged(String val)async {
  61. search = search_controller.text;
  62. await loadUnit();
  63. }
  64. Future scan() async {
  65. try {
  66. search = '';
  67. setState(() => search_controller.text = search);
  68. ScanResult result = await BarcodeScanner.scan();
  69. String barcode = result.rawContent;
  70. setState(() => this.search = barcode);
  71. } on PlatformException catch (e) {
  72. if (e.code == BarcodeScanner.cameraAccessDenied) {
  73. util.showFlushbar(context, 'The user did not grant the camera permission!',color: Colors.red);
  74. setState(() {
  75. this.search = '';
  76. });
  77. } else {
  78. util.showFlushbar(context, 'Unknown error: $e',color: Colors.red);
  79. setState(() => this.search = '');
  80. }
  81. } on FormatException {
  82. setState(() => this.search =
  83. '');
  84. } catch (e) {
  85. util.showFlushbar(context, 'Unknown error: $e',color: Colors.red);
  86. setState(() => this.search = '');
  87. }
  88. setState(() => search_controller.text = search);
  89. }
  90. @override
  91. void initState() {
  92. // TODO: implement initState
  93. super.initState();
  94. // _tabBarcontroller = new TabController(length: 1, vsync:this);
  95. WidgetsBinding.instance.addPostFrameCallback((_) async {
  96. util.showLoading(context);
  97. await Future.sync(()async{await loadUnit();});
  98. Navigator.pop(context);
  99. if(locationStream==null)await util.streamLocation(context);
  100. else {
  101. if(locationStream.isPaused) locationStream.resume();
  102. }
  103. // setState(() {
  104. // unitsRef.add(new Unit(flag: 'False',tipe: "sdasdas",id: 2,mesin: "sdfasdas",kode: "dasdas",rangka: "asdasd",tahun: "2020",warna: "MERAH",state: "OnChanne;"));
  105. // unitsRef.add(new Unit(flag: 'False',tipe: "sdasdas",id: 2,mesin: "sdfasdas",kode: "dasdas",rangka: "asdasd",tahun: "2020",warna: "MERAH",state: "OnChanne;"));
  106. // unitsRef.add(new Unit(flag: 'False',tipe: "sdasdas",id: 2,mesin: "sdfasdas",kode: "dasdas",rangka: "asdasd",tahun: "2020",warna: "MERAH",state: "OnChanne;"));
  107. // unitsRef.add(new Unit(flag: 'False',tipe: "sdasdas",id: 2,mesin: "sdfasdas",kode: "dasdas",rangka: "asdasd",tahun: "2020",warna: "MERAH",state: "OnChanne;"));
  108. // unitsRef.add(new Unit(flag: 'False',tipe: "sdasdas",id: 2,mesin: "sdfasdas",kode: "dasdas",rangka: "asdasd",tahun: "2020",warna: "MERAH",state: "OnChanne;"));
  109. // });
  110. });
  111. }
  112. @override
  113. void dispose() {
  114. // TODO: implement dispose
  115. super.dispose();
  116. print('LocationStream paused');
  117. if(!locationStream.isPaused)locationStream.pause();
  118. }
  119. @override
  120. Widget build(BuildContext context) {
  121. return WillPopScope(
  122. onWillPop: ()async{
  123. if(hideAppbar) {
  124. setState(() {
  125. hideAppbar=false;
  126. search = '';
  127. search_controller.text = '';
  128. });
  129. await loadUnit();
  130. return false;
  131. }
  132. else {
  133. return true;
  134. }
  135. },
  136. child: Scaffold(
  137. appBar: (hideAppbar)?
  138. AppBar(
  139. backgroundColor: Colors.white,
  140. leading: GestureDetector(
  141. onTap:()async{
  142. setState(() {
  143. hideAppbar=false;
  144. search = '';
  145. search_controller.text = '';
  146. });
  147. await loadUnit();
  148. },child: Container(width: 20,child: Icon(Icons.arrow_back,color:Colors.grey))),
  149. title: Container(
  150. color: Colors.white,
  151. child: TextFormField(
  152. maxLines: 1,
  153. controller: search_controller,
  154. onChanged: (val) => debounce(const Duration(milliseconds: 300), _onChanged, [val]),
  155. // onChanged: (value)async{
  156. // search = search_controller.text;
  157. // await loadUnit();
  158. // },
  159. decoration: InputDecoration.collapsed(
  160. hintText: 'Search..',
  161. ),
  162. ),
  163. ),
  164. actions: <Widget>[
  165. TextButton(
  166. onPressed: ()async{await scan();await loadUnit();},
  167. child: Icon(Icons.select_all,color:Colors.grey),
  168. )
  169. ],
  170. )
  171. :null,
  172. // AppBar(
  173. // backgroundColor: Colors.indigo.withOpacity(0.8),
  174. // title: Text('Unit Stocking'),
  175. // actions: <Widget>[
  176. // IconButton(
  177. // icon: Icon(Icons.search,color:Colors.white),
  178. // onPressed: (){
  179. // setState(() {
  180. // hideAppbar = true;
  181. // });
  182. // },
  183. // ),
  184. // ],
  185. // ),
  186. body: Column(
  187. children: <Widget>[
  188. (hideAppbar)?Container():SizedBox(height: MediaQuery.of(context).size.height/25,),
  189. Expanded(
  190. child:Stack(
  191. children: <Widget>[
  192. Container(
  193. child: ListView.builder(
  194. padding: EdgeInsets.only(bottom: 10),
  195. itemCount: unitsRef.length,
  196. shrinkWrap: false,
  197. itemBuilder: (context,index){
  198. Uint8List display;
  199. display = unitsRef[index].flag=='FALSE'?null:(BlobsRef.length==unitsRef.length)?BlobsRef[index].blob_file:null;
  200. return Column(
  201. children: <Widget>[
  202. (index==0)?Container(padding: EdgeInsets.only(top: 10,left: 10,right: 10),alignment: Alignment.centerRight,
  203. child: Row(
  204. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  205. children: <Widget>[
  206. Row(
  207. children: <Widget>[
  208. Checkbox(
  209. value: completed,
  210. onChanged: (value)async{
  211. setState(() {
  212. completed = value;
  213. });
  214. await loadUnit();
  215. },
  216. ),
  217. Text('Completed')
  218. ],
  219. ),
  220. (completed||hideAppbar)?Container():Row(
  221. mainAxisAlignment: MainAxisAlignment.end,
  222. children: <Widget>[
  223. Text('Unit : ',style: TextStyle(color: Colors.grey,fontSize: 15),),
  224. 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),),
  225. Text(!(unitsRef.length==unitsRef.where((element) => element.flag=='TRUE').length)?' of':'',style: TextStyle(color: Colors.grey,fontSize: 15),),
  226. Text(!(unitsRef.length==unitsRef.where((element) => element.flag=='TRUE').length)?' ${unitsRef.length}':'',style: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold,),),
  227. ],
  228. ),
  229. ],
  230. ),):Container(),
  231. Padding(
  232. padding: const EdgeInsets.only(left:10,right: 10,top: 10),
  233. child: Container(
  234. padding: EdgeInsets.all(5.0),
  235. decoration: BoxDecoration(
  236. borderRadius: BorderRadius.circular(5),
  237. color: Colors.white,
  238. boxShadow: [
  239. BoxShadow(
  240. color: Colors.grey,
  241. blurRadius: 5.0, // has the effect of softening the shadow
  242. spreadRadius: 2.0, // has the effect of extending the shadow
  243. offset: Offset(
  244. 00.0, // horizontal, move right 10
  245. 2.0, // vertical, move down 10
  246. ),
  247. )
  248. ],
  249. border: Border.all(color: Colors.grey.withOpacity(0.5)),
  250. ),
  251. child:Row(
  252. children: <Widget>[
  253. Expanded(
  254. flex: 3,
  255. child: InkWell(
  256. onTap: ()async{
  257. // if(display!=null)Navigator.push(context, MaterialPageRoute(builder: (context) => PhotoViewer(Blobs[index].blob_file,id: Blobs[index].blob_id.toString(),edit: false,jenis: Blobs[index].jenis,)));
  258. if(display==null){
  259. var result = await Navigator.push(
  260. context,
  261. MaterialPageRoute(
  262. builder: (context) => UnitDetails(unit: unitsRef[index],),
  263. ),
  264. );
  265. if(result!=null){
  266. util.showLoading(context);
  267. await loadUnit();
  268. Navigator.pop(context);
  269. }
  270. }
  271. else{
  272. await Navigator.push(context, MaterialPageRoute(builder: (context) => PhotoViewer(display,id: unitsRef[index].id.toString(),jenis: '',edit: false,)));
  273. }
  274. },
  275. child: Hero(tag: unitsRef[index].id,child: Padding(
  276. padding: EdgeInsets.only(right: 10),
  277. child: Container(width: 100,height: 100,alignment: Alignment.center,child:(display==null)?Icon(Icons.crop_original,color: Colors.white,size: 80,):null,
  278. decoration: BoxDecoration(
  279. color: Colors.grey.withOpacity(0.5),
  280. image: (display!=null)?DecorationImage(
  281. image: MemoryImage(display),fit: BoxFit.cover,):null,)),
  282. )),
  283. )),
  284. Expanded(
  285. flex: 7,
  286. child: InkWell(
  287. onTap: ()async{
  288. var result;
  289. // if(display!=null) {
  290. // result = await Navigator.push(
  291. // context,
  292. // MaterialPageRoute(
  293. // builder: (context) => UnitDetails(idInsert: unitsRef[index].mesin_id,),
  294. // ),
  295. // );
  296. // }
  297. // if(display==null){
  298. result = await Navigator.push(
  299. context,
  300. MaterialPageRoute(
  301. builder: (context) => UnitDetails(unit: unitsRef[index],),
  302. ),
  303. );
  304. // }
  305. if(result!=null){
  306. util.showLoading(context);
  307. await loadUnit();
  308. Navigator.pop(context);
  309. }
  310. },
  311. child: SingleChildScrollView(
  312. scrollDirection: Axis.horizontal,
  313. child: Column(
  314. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  315. crossAxisAlignment: CrossAxisAlignment.start,
  316. children: <Widget>[
  317. Text('Rangka : ${unitsRef[index].rangka}'),
  318. Divider(height: 10,),
  319. Text('Tipe : ${unitsRef[index].tipe}'),
  320. Divider(height: 10,),
  321. Row(
  322. children: <Widget>[
  323. // Container(width: MediaQuery.of(context).size.width*0.35,child: Text('State : ${unitsRef[index].state}')),
  324. // Container(width: MediaQuery.of(context).size.width*0.5,child: Text('Tipe : ${unitsRef[index].tipe}',style: TextStyle(fontSize: 12),)),
  325. Text('Timestamp : ${unitsRef[index].timestamp}'),
  326. ],
  327. ),
  328. Divider(height: 10,),
  329. Row(
  330. children: <Widget>[
  331. Container(width: MediaQuery.of(context).size.width*0.35,child: Text('Warna : ${unitsRef[index].warna}')),
  332. Text('State : ${unitsRef[index].state}'),
  333. ],
  334. )
  335. ],
  336. ),
  337. ),
  338. )),
  339. ],
  340. )),
  341. ),
  342. ],
  343. );
  344. },
  345. ),
  346. ),
  347. ],
  348. ),
  349. ),
  350. ],
  351. ),
  352. floatingActionButton: FloatingActionButton(
  353. backgroundColor: Colors.indigo.withOpacity(0.8),
  354. onPressed: ()async{
  355. setState(() {
  356. hideAppbar = !(hideAppbar??false);
  357. });
  358. // var result = await Navigator.push(context, MaterialPageRoute(builder: (context)=>UnitDetails(unit: new Unit(flag: 'FALSE'),)));
  359. // if(result!=null){
  360. // util.showLoading(context);
  361. // await loadUnit();
  362. // Navigator.pop(context);
  363. // }
  364. },
  365. child: Icon(Icons.search,color:Colors.white),
  366. ),
  367. ),
  368. );
  369. }
  370. }