flutter app untuk unitstock
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 

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