flutter app untuk unitstock
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

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