flutter app untuk unitstock
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 

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