flutter app untuk unitstock
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

444 lignes
21 KiB

  1. import 'dart:io';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4. import 'main.dart';
  5. import 'Util/Prefs.dart';
  6. class LoginPage extends StatefulWidget {
  7. LoginPage({Key key}) : super(key: key);
  8. @override
  9. _LoginPageState createState() => _LoginPageState();
  10. }
  11. class _LoginPageState extends State<LoginPage> {
  12. final userCon = new TextEditingController();
  13. final passCon = new TextEditingController();
  14. final hostAddress = new TextEditingController();
  15. List<dynamic> cabangDrop = [];
  16. String selected;
  17. Login()async{
  18. util.showLoading(context);
  19. var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/');
  20. if(result['STATUS']==1){
  21. prefs.setString(keyClass.loginId, result['DATA'][keyClass.loginId.toLowerCase()]);
  22. print("user id ${result['DATA'][keyClass.loginId.toLowerCase()]}");
  23. prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]);
  24. prefs.setBool(keyClass.logged_in, true);
  25. var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/');
  26. Navigator.pop(context);
  27. if(cabangList['STATUS']==1){
  28. cabangDrop = cabangList['DATA'];
  29. selected = cabangDrop[0]['RETURN_VALUE'];
  30. setState(() {
  31. });
  32. FocusScope.of(context).requestFocus(new FocusNode());
  33. }
  34. else{
  35. util.showFlushbar(context, cabangList['DATA'],color: Colors.red);
  36. }
  37. }
  38. else{
  39. Navigator.pop(context);
  40. util.showFlushbar(context, result['DATA'],color: Colors.red);
  41. }
  42. }
  43. @override
  44. Widget build(BuildContext context) {
  45. // if(prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in)){
  46. return Scaffold(
  47. resizeToAvoidBottomInset: true,
  48. body: WillPopScope(
  49. onWillPop: ()async{
  50. if(prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in)){
  51. await showDialog(context: context,builder: (context)=>AlertDialog(
  52. content: Text('Exit the app?'),
  53. actions: <Widget>[
  54. TextButton(
  55. child: Text('Exit'),
  56. onPressed: ()async{
  57. Navigator.pop(context);
  58. await locationStream?.cancel();
  59. exit(0);
  60. },
  61. ),
  62. TextButton(
  63. child: Text('Cancel'),
  64. onPressed: (){
  65. Navigator.pop(context);
  66. },
  67. )
  68. ],
  69. ));
  70. }
  71. else{
  72. setState(() {
  73. prefs.setBool(keyClass.logged_in, false);
  74. prefs.remove(keyClass.cabang_id);
  75. prefs.remove(keyClass.company);
  76. prefs.remove(keyClass.loginId);
  77. });
  78. }
  79. return false;
  80. },
  81. child: Container(
  82. decoration: BoxDecoration(
  83. color: Colors.white
  84. ),
  85. child: Stack(
  86. children: <Widget>[
  87. Positioned.fill(
  88. child: Column(
  89. children: <Widget>[
  90. Expanded(
  91. flex: 1,
  92. child: Container(),
  93. ),
  94. Expanded(
  95. flex: 3,
  96. child: InkWell(
  97. onLongPress: ()async{
  98. hostAddress.text = prefs.getString(keyClass.hostAddress);
  99. await showDialog(context: context,builder: (context)=>AlertDialog(
  100. title: Text('Set IP Address'),
  101. content: TextField(
  102. controller: hostAddress,
  103. onSubmitted: (value){
  104. prefs.setString(keyClass.hostAddress,(value=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':value);
  105. Navigator.pop(context);
  106. },
  107. ),
  108. actions: <Widget>[
  109. TextButton(
  110. child: Text('OK'),
  111. onPressed: (){
  112. prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':hostAddress.text);
  113. Navigator.pop(context);
  114. },
  115. )
  116. ],
  117. ));
  118. },
  119. child: Column(
  120. children: <Widget>[
  121. Container(child: Icon(Icons.input,size: 150,color: Colors.indigo,),),
  122. Text('Login',style: TextStyle(fontSize: 25,color: Colors.indigo,fontWeight: FontWeight.bold),),
  123. ],
  124. ),
  125. ),
  126. ),
  127. Expanded(
  128. flex: 3,
  129. child: Column(
  130. children: <Widget>[
  131. Container(
  132. width: MediaQuery.of(context).size.width*0.8,
  133. child: TextFormField(
  134. controller: userCon,
  135. style: TextStyle(color: Colors.indigo,fontSize: 16),
  136. decoration: InputDecoration(
  137. hintText: 'User ID',
  138. contentPadding:EdgeInsets.only(left: 30,right: 30,top: 20,bottom: 20),
  139. hintStyle: TextStyle(fontSize: 16,color: Colors.indigo.withOpacity(0.7)),
  140. focusedBorder: OutlineInputBorder(
  141. borderSide: BorderSide(
  142. color: Colors.indigo,
  143. width: 2),
  144. borderRadius: BorderRadius.circular(100)
  145. ),
  146. enabledBorder: OutlineInputBorder(
  147. borderSide: BorderSide(
  148. color: Colors.indigo.withOpacity(0.5),
  149. width: 0.5),
  150. borderRadius: BorderRadius.circular(100)
  151. )
  152. ),
  153. ),
  154. ),
  155. SizedBox(height: 15,),
  156. Container(
  157. width: MediaQuery.of(context).size.width*0.8,
  158. child: TextFormField(
  159. obscureText: true,
  160. controller: passCon,
  161. style: TextStyle(color: Colors.indigo,fontSize: 16),
  162. decoration: InputDecoration(
  163. contentPadding:EdgeInsets.only(left: 30,right: 30,top: 20,bottom: 20),
  164. hintText: 'Password',
  165. hintStyle: TextStyle(fontSize: 16,color: Colors.indigo.withOpacity(0.7)),
  166. focusedBorder: OutlineInputBorder(
  167. borderSide: BorderSide(
  168. color: Colors.indigo,
  169. width: 2),
  170. borderRadius: BorderRadius.circular(100)
  171. ),
  172. enabledBorder: OutlineInputBorder(
  173. borderSide: BorderSide(
  174. color: Colors.indigo.withOpacity(0.5),
  175. width: 0.5),
  176. borderRadius: BorderRadius.circular(100)
  177. )
  178. ),
  179. ),
  180. ),
  181. SizedBox(height: 30,),
  182. TextButton(
  183. onPressed: Login,
  184. style: TextButton.styleFrom(
  185. backgroundColor: Colors.indigo,
  186. padding: EdgeInsets.all(15),
  187. shape: RoundedRectangleBorder(
  188. borderRadius: BorderRadius.circular(100.0),
  189. side: BorderSide(color: Colors.indigo)
  190. ),
  191. ),
  192. child: Container(width: MediaQuery.of(context).size.width*0.7,child: Text('Login',textAlign: TextAlign.center,style: TextStyle(color: Colors.white,fontSize: 21),)),
  193. )
  194. ],
  195. ),
  196. ),
  197. // Expanded(
  198. // flex: 3,
  199. // child: Container(color: Colors.yellow,),
  200. // ),
  201. ],
  202. ),
  203. ),
  204. (prefs.getBool(keyClass.logged_in)==null||!prefs.getBool(keyClass.logged_in))
  205. ?Container()
  206. :Positioned.fill(
  207. child: Container(
  208. color: Colors.white.withOpacity(0.9),
  209. child: Center(
  210. child: Container(
  211. decoration: BoxDecoration(
  212. color: Colors.white,
  213. boxShadow: [
  214. BoxShadow(
  215. color: Colors.grey.withOpacity(0.5),
  216. spreadRadius: 5,
  217. blurRadius: 7,
  218. offset: Offset(0, 3), // changes position of shadow
  219. ),
  220. ],
  221. borderRadius: BorderRadius.circular(5)
  222. ),
  223. height: MediaQuery.of(context).size.height/3.2,
  224. width: MediaQuery.of(context).size.width*0.75,
  225. child: Column(
  226. children: <Widget>[
  227. Flexible(
  228. flex:3,
  229. child: Container(
  230. padding: EdgeInsets.only(top:10,left: 10,right: 10),
  231. alignment: Alignment.center,
  232. decoration: BoxDecoration(
  233. // color: Colors.indigo,
  234. borderRadius: BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5))
  235. ),
  236. child: Column(
  237. mainAxisSize: MainAxisSize.min,
  238. crossAxisAlignment: CrossAxisAlignment.center,
  239. children: <Widget>[
  240. Icon(Icons.business,size: 70,color: Colors.indigo,),
  241. SizedBox(height: 5,),
  242. Text('Pilih Cabang',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16,color: Colors.indigo),)
  243. ],
  244. ),
  245. ),
  246. ),
  247. Flexible(
  248. flex: 1,
  249. child: Container(
  250. padding: EdgeInsets.only(left: 20,right: 20),
  251. alignment: Alignment.centerLeft,
  252. child: Theme(
  253. data: ThemeData(
  254. canvasColor: Colors.white,
  255. primaryColor: Colors.indigo,
  256. accentColor: Colors.indigo,
  257. hintColor: Colors.indigo
  258. ),
  259. child: DropdownButtonFormField(
  260. style: TextStyle(color: Colors.black.withOpacity(0.6),fontWeight: FontWeight.w500,fontSize: 14,),
  261. decoration: InputDecoration(
  262. contentPadding: EdgeInsets.all(8.0),
  263. ),
  264. value: selected,
  265. onChanged: (value){
  266. setState(() {
  267. selected = value;
  268. });
  269. },
  270. items: cabangDrop.map<DropdownMenuItem<dynamic>>((item)=>DropdownMenuItem(
  271. value: item['RETURN_VALUE'],
  272. child: Text(item["DISPLAY_VALUE"]),
  273. )).toList(),
  274. ),
  275. ),
  276. ),
  277. ),
  278. Flexible(
  279. flex: 1,
  280. child: Container(
  281. child: Row(
  282. mainAxisAlignment: MainAxisAlignment.end,
  283. children: <Widget>[
  284. ButtonTheme(
  285. minWidth: 10,
  286. child: TextButton(
  287. onPressed: (){
  288. prefs.setString(keyClass.cabang_id, selected);
  289. Navigator.pushNamed(context, '/home');
  290. },
  291. child: Text('Set',style: TextStyle(color: Colors.indigo),),
  292. ),
  293. ),
  294. TextButton(
  295. onPressed: (){
  296. setState(() {
  297. prefs.setBool(keyClass.logged_in, false);
  298. prefs.remove(keyClass.cabang_id);
  299. prefs.remove(keyClass.company);
  300. prefs.remove(keyClass.loginId);
  301. });
  302. },
  303. child: Text('Cancel',style: TextStyle(color: Colors.indigo)),
  304. )
  305. ],
  306. ),
  307. ),
  308. )
  309. ],
  310. ),
  311. ),
  312. ),
  313. )
  314. ),
  315. ],
  316. ),
  317. ),
  318. ),
  319. );
  320. // }
  321. // else{
  322. // return WillPopScope(
  323. // onWillPop: ()async{
  324. // setState(() {
  325. // prefs.setBool(keyClass.logged_in, false);
  326. // prefs.remove(keyClass.cabang_id);
  327. // prefs.remove(keyClass.company);
  328. // prefs.remove(keyClass.loginId);
  329. // });
  330. // return false;
  331. // },
  332. // child: Material(
  333. // child: Container(
  334. // color: Colors.grey.withOpacity(0.7),
  335. // child: Center(
  336. // child: Container(
  337. // decoration: BoxDecoration(
  338. // color: Colors.white,
  339. // borderRadius: BorderRadius.circular(5)
  340. // ),
  341. // height: MediaQuery.of(context).size.height/3.2,
  342. // width: MediaQuery.of(context).size.width*0.75,
  343. // child: Column(
  344. // children: <Widget>[
  345. // Flexible(
  346. // flex:3,
  347. // child: Container(
  348. // padding: EdgeInsets.only(top:10,left: 10,right: 10),
  349. // alignment: Alignment.center,
  350. // decoration: BoxDecoration(
  351. //// color: Colors.indigo,
  352. // borderRadius: BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5))
  353. // ),
  354. // child: Column(
  355. // mainAxisSize: MainAxisSize.min,
  356. // crossAxisAlignment: CrossAxisAlignment.center,
  357. // children: <Widget>[
  358. // Icon(Icons.business,size: 70,color: Colors.indigo,),
  359. // SizedBox(height: 5,),
  360. // Text('Pilih Cabang',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16,color: Colors.indigo),)
  361. // ],
  362. // ),
  363. // ),
  364. // ),
  365. // Flexible(
  366. // flex: 1,
  367. // child: Container(
  368. // padding: EdgeInsets.only(left: 20,right: 20),
  369. // alignment: Alignment.centerLeft,
  370. // child: Theme(
  371. // data: ThemeData(
  372. // canvasColor: Colors.white,
  373. // primaryColor: Colors.indigo,
  374. // accentColor: Colors.indigo,
  375. // hintColor: Colors.indigo
  376. // ),
  377. // child: DropdownButtonFormField(
  378. // style: TextStyle(color: Colors.black.withOpacity(0.6),fontWeight: FontWeight.w500,fontSize: 14,),
  379. // decoration: InputDecoration(
  380. // contentPadding: EdgeInsets.all(8.0),
  381. // ),
  382. // value: selected,
  383. // onChanged: (value){
  384. // setState(() {
  385. // selected = value;
  386. // });
  387. // },
  388. // items: cabangDrop.map<DropdownMenuItem<dynamic>>((item)=>DropdownMenuItem(
  389. // value: item['RETURN_VALUE'],
  390. // child: Text(item["DISPLAY_VALUE"]),
  391. // )).toList(),
  392. // ),
  393. // ),
  394. // ),
  395. // ),
  396. // Flexible(
  397. // flex: 1,
  398. // child: Container(
  399. // child: Row(
  400. // mainAxisAlignment: MainAxisAlignment.end,
  401. // children: <Widget>[
  402. // ButtonTheme(
  403. // minWidth: 10,
  404. // child: TextButton(
  405. // onPressed: (){
  406. // prefs.setString(keyClass.cabang_id, selected);
  407. // Navigator.pushNamed(context, '/home');
  408. // },
  409. // child: Text('Set',style: TextStyle(color: Colors.indigo),),
  410. // ),
  411. // ),
  412. // TextButton(
  413. // onPressed: (){
  414. // setState(() {
  415. // prefs.setBool(keyClass.logged_in, false);
  416. // prefs.remove(keyClass.cabang_id);
  417. // prefs.remove(keyClass.company);
  418. // prefs.remove(keyClass.loginId);
  419. // });
  420. // },
  421. // child: Text('Cancel',style: TextStyle(color: Colors.indigo)),
  422. // )
  423. // ],
  424. // ),
  425. // ),
  426. // )
  427. // ],
  428. // ),
  429. // ),
  430. // ),
  431. // ),
  432. // ),
  433. // );
  434. // }
  435. }
  436. }