import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:healthcare_user/common/login.dart'; import 'package:healthcare_user/google_maps_place_picker_mb/google_maps_place_picker.dart'; import 'package:healthcare_user/keys.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:geolocator/geolocator.dart'; import 'package:flutter/services.dart'; import 'dart:io' show File, Platform; import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; import 'package:location/location.dart' as locationmap; import '../google_maps_place_picker_mb/src/models/pick_result.dart'; import '../google_maps_place_picker_mb/src/place_picker.dart'; import 'otpscreen.dart'; class SignUp extends StatefulWidget { const SignUp({super.key}); @override State createState() => _SignUpState(); } class _SignUpState extends State { bool isPwdObscureText=true; bool isConfirmPwdObscureText = true; TextEditingController nameController = TextEditingController(); TextEditingController custmerid = TextEditingController(); TextEditingController buildingNameController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController mobileNumberController = TextEditingController(); TextEditingController userAddressDescriptionController = TextEditingController(); TextEditingController userAddressCapturingController = TextEditingController(); TextEditingController passwordController = TextEditingController(); TextEditingController confirmPasswordController = TextEditingController(); var genderUnitItems = [ 'Male', 'Female', 'Other', ]; var genderUnit = 'Male'; String? gender; String _currentAddress =''; Position? _currentPosition; String address1 = ''; String address2 = ''; String city = ''; String state = ''; String zip = ''; String country = ''; double lat=0; double lng=0; @override void initState() { isPwdObscureText = true; isConfirmPwdObscureText = true; super.initState(); } PickResult? selectedPlace; bool _mapsInitialized = false; final String _mapsRenderer = "latest"; var kInitialPosition = const LatLng(15.462477, 78.717401); locationmap.Location location = locationmap.Location(); final GoogleMapsFlutterPlatform mapsImplementation = GoogleMapsFlutterPlatform.instance; void initRenderer() { if (_mapsInitialized) return; if (mapsImplementation is GoogleMapsFlutterAndroid) { switch (_mapsRenderer) { case "legacy": (mapsImplementation as GoogleMapsFlutterAndroid) .initializeWithRenderer(AndroidMapRenderer.legacy); break; case "latest": (mapsImplementation as GoogleMapsFlutterAndroid) .initializeWithRenderer(AndroidMapRenderer.latest); break; } } setState(() { _mapsInitialized = true; }); } Future onWillPop() async { final shouldPop = await showDialog(context: context, builder: (context) { return AlertDialog( title: const Text('Do you want to exit app?', style: TextStyle( color: primaryColor, fontSize: 20, )), actionsAlignment: MainAxisAlignment.spaceBetween, actions: [ TextButton( onPressed: () { SystemNavigator.pop(); }, child: const Text('Yes', style: TextStyle( color: primaryColor, fontSize: 20, )), ), TextButton( onPressed: () { Navigator.of(context).pop(false); }, child: const Text('No', style: TextStyle( color: primaryColor, fontSize: 20, )), ), ], ); }, ); return shouldPop!; } @override Widget build(BuildContext context) { return WillPopScope( onWillPop:()async=>onWillPop(), child: Scaffold( backgroundColor: primaryColor, body: Stack(children: [ /* Container( decoration: const BoxDecoration( image: DecorationImage(image: AssetImage("images/background.png"), fit: BoxFit.cover,), ), ),*/ GestureDetector( onTap: () { FocusManager.instance.primaryFocus?.unfocus(); }, child: SafeArea( child: SingleChildScrollView( child: Padding( padding: EdgeInsets.all(10), child: Column( children: [ SizedBox( height: 20, ), Container( //width: double.infinity, child: Image( image: const AssetImage('images/logo.png'), height: MediaQuery.of(context).size.height * .18, )), SizedBox( height:MediaQuery.of(context).size.height * .05, ), Container( child: TextFormField( cursorColor: Colors.white, style: TextStyle(color: Colors.white), controller: nameController, textCapitalization: TextCapitalization.words, decoration: textFormFieldDecoration(Icons.person,'Enter Name'), ), ), //name SizedBox(height:MediaQuery.of(context).size.height * .02,), Text('Select Gender',style: radioHeadingTextStyle(),), Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded(child: RadioListTile( title: Text("Male",style: radioItemsTextStyle()), value: "male", groupValue: gender, activeColor: Colors.white, onChanged: (value){ setState(() { gender = value.toString(); }); }, ),), Expanded(child: RadioListTile( title: Text("Female",style:radioItemsTextStyle()), value: "female", groupValue: gender, activeColor: Colors.white, onChanged: (value){ setState(() { gender = value.toString(); }); }, ),), Expanded(child: RadioListTile( title: Text("Others",style: radioItemsTextStyle()), value: "other", groupValue: gender, activeColor: Colors.white, onChanged: (value){ setState(() { gender = value.toString(); }); }, ),), ], ), /*Container( child: DropdownButtonFormField( // Initial Value value: genderUnit, isExpanded: true, decoration: const InputDecoration( filled: true, fillColor: primaryColor, prefixIcon: Icon( Icons.female, color: Colors.white, ), border: OutlineInputBorder( borderSide: BorderSide(color: Colors.white)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.white), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.white), ), labelText: 'Select Gender', labelStyle: TextStyle(color: Colors.white), ), hint: Text('Units'), // Down Arrow Icon //icon: const Icon(Icons.keyboard_arrow_down), // Array list of items items: genderUnitItems.map((String items) { return DropdownMenuItem( value: items, child: Text( items, style: TextStyle( fontSize: 16,color: primaryColor ), textAlign: TextAlign.center, )); }).toList(), // After selecting the desired option,it will // change button value to selected value onChanged: (String? newValue) { setState(() { genderUnit = newValue!; }); }, ),),*/ SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( cursorColor: Colors.white, style: TextStyle(color: Colors.white), controller: mobileNumberController, keyboardType: TextInputType.phone, maxLength: 10, decoration: textFormFieldDecoration(Icons.phone_android,'Enter Mobile Number'), ), ), //mobile SizedBox(height:MediaQuery.of(context).size.height * .02,), GestureDetector( child: Container( child: TextFormField( cursorColor: Colors.white, style: TextStyle(color: Colors.white), textCapitalization: TextCapitalization.words, controller: userAddressCapturingController, onTap:() { //============================================================================================= location.serviceEnabled().then((value) { if (value) { initRenderer(); Navigator.push( context, MaterialPageRoute( builder: (context) { return PlacePicker( resizeToAvoidBottomInset: false, hintText: "Find a place ...", searchingText: "Please wait ...", selectText: "Select place", outsideOfPickAreaText: "Place not in area", initialPosition: kInitialPosition, useCurrentLocation: true, selectInitialPosition: true, usePinPointingSearch: true, usePlaceDetailSearch: true, zoomGesturesEnabled: true, zoomControlsEnabled: true, onMapCreated: (GoogleMapController controller) {}, onPlacePicked: (PickResult result) { setState(() { selectedPlace = result; lat=selectedPlace!.geometry!.location.lat; lng=selectedPlace!.geometry!.location.lng; if(selectedPlace!.types!.length==1){ userAddressCapturingController.text = selectedPlace!.formattedAddress!; } else{ userAddressCapturingController.text =selectedPlace!.name!+', '+selectedPlace!.formattedAddress!; } Navigator.of(context).pop(); }); }, onMapTypeChanged: (MapType mapType) {}, apiKey: Platform.isAndroid ? APIKeys.androidApiKey : APIKeys.iosApiKey, forceAndroidLocationManager: true, ); }, ), ); } else { showGeneralDialog( context: context, pageBuilder: (context, x, y) { return Scaffold( backgroundColor: Colors.grey.withOpacity(.5), body: Center( child: Container( width: double.infinity, height: 150, padding: const EdgeInsets.symmetric(horizontal: 20), child: Card( child: Padding( padding: const EdgeInsets.all(10.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "Please enable the location", style: TextStyle( fontSize:18, fontWeight: FontWeight.w500, ), ), const SizedBox( height: 20, ), ElevatedButton( onPressed: () { Navigator.pop(context); }, child: const Text("Cancel"), ), ], ), ), ), ), ), ); }, ); } }); //===================================================================================== // _getCurrentPosition(); }, keyboardType: TextInputType.streetAddress, readOnly: true, decoration:textFormFieldDecoration(Icons.location_on_rounded,'Click to select address(map)'), ), ), /* onTap: () { },*///address ),//address capturing SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( cursorColor: Colors.white, style: TextStyle(color: Colors.white), textCapitalization: TextCapitalization.words, controller: userAddressDescriptionController, keyboardType: TextInputType.emailAddress, decoration: textFormFieldDecoration(Icons.plagiarism_outlined,'Address Description (Ex: Flat No)'), ), ),//address description SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( cursorColor: Colors.white, style: TextStyle(color: Colors.white), obscureText: isPwdObscureText, controller: passwordController, decoration: InputDecoration( fillColor: primaryColor, filled: true, labelText: 'Create Password', prefixIcon: const Icon( Icons.lock, color: Colors.white, ), labelStyle: const TextStyle( color: Colors.white, //<-- SEE HERE ), border: const OutlineInputBorder( borderSide: BorderSide(color: Colors.white)), focusedBorder: const OutlineInputBorder( borderSide: BorderSide(color: Colors.white), ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide(color: Colors.white), ), suffixIcon: IconButton( icon: Icon( Icons.visibility_off_outlined, color: isPwdObscureText?buttonColors:Colors.white, ), onPressed: () { setState(() { isPwdObscureText = !isPwdObscureText; }); }, ), ), ), ), //pwd SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( width:double.infinity, height: MediaQuery.of(context).size.height * .06, child: ElevatedButton( style: ElevatedButton.styleFrom( primary: buttonColors, // background onPrimary: Colors.black, // foreground ), onPressed: () async { if (nameController.text != '' && passwordController.text != '' && mobileNumberController.text != ''&&gender!='') { AppSettings.preLoaderDialog(context); var payload = new Map(); payload["username"] = nameController.text.toString(); payload["password"] = passwordController.text.toString(); payload["phone"] = mobileNumberController.text.toString(); payload["firstName"] = nameController.text.toString(); payload["emails"] = [ {"email": emailController.text.toString()} ]; payload["lastName"] = ''; payload["address1"] = userAddressCapturingController.text; payload["address2"] = userAddressDescriptionController.text; payload["city"] = ''; payload["state"] = ''; payload["zip"] = ''; payload["country"] = ''; payload["notes"] = ''; payload["latitude"] = lat; payload["longitude"] = lng; payload["fcmId"] = AppSettings.fcmId; payload["age"] = 0; /* payload["gender"] = genderUnit.toString();*/ payload["gender"] = gender.toString(); bool signUpStatus = await AppSettings.signUp(payload); try { if (signUpStatus) { var smsPayload = new Map(); smsPayload["mobileNumbers"] = mobileNumberController.text.toString(); bool sendSms = await AppSettings.sendSms(smsPayload); if(sendSms){ Navigator.of(context, rootNavigator: true).pop(); Navigator.push( context, MaterialPageRoute( builder: (context) => OtpScreen(myObject: mobileNumberController.text.toString(),)), ); } else{ Navigator.of(context, rootNavigator: true).pop(); } } else { Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast( "Mobile number already exists"); } } catch (exception) { print(exception); Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast("Please enter valid details"); } } else { AppSettings.longFailedToast("details should not be empty"); } }, child: Text('Sign Up'), )),//login button Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( 'Are you a Member?', style: TextStyle( color: Colors.white, ), ), TextButton( child: const Text( 'Login?', style: TextStyle( fontSize: 20, color: Colors.white, decoration: TextDecoration.underline, ), ), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const Login()), ); }, ) ], ), ], ), ) )), ), ])), ); } showUserSignUSuccessDialog() async { custmerid.text=AppSettings.customerIdsign; return showDialog( context: context, barrierDismissible: false, useSafeArea: true, builder: (BuildContext context) { return StatefulBuilder( builder: (BuildContext context, StateSetter setState) { return AlertDialog( title: const Text('User SignUp Successfully!!'), content: SingleChildScrollView( child: ListBody( children: [ Container( padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, readOnly: true, controller: nameController, decoration: const InputDecoration( prefixIcon: Icon( Icons.person, color: greyColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'User Name', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), ), Container( padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, readOnly: true, controller:custmerid, decoration: const InputDecoration( prefixIcon: Icon( Icons.person, color: greyColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'User Id', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), ), // AppSettings.saveAvailableReportAndLocationsInMemorysignup('customerId'); const SizedBox( height:10, ), Container( padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, readOnly: true, controller: buildingNameController, decoration: const InputDecoration( prefixIcon: Icon( Icons.home_filled, color: greyColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Building Name', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), ), const SizedBox( height:10, ), Container( padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, readOnly: true, controller: emailController, decoration: const InputDecoration( prefixIcon: Icon( Icons.email, color: greyColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Email', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), ), ], ), ), actions: [ Container( width: 400, height: 50, padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), child: ElevatedButton( style: ElevatedButton.styleFrom( primary: primaryColor, // background onPrimary: Colors.white, // foreground ), onPressed: () async{ await Navigator.push( context, MaterialPageRoute( builder: (context) => const Login()), ); }, child: const Text('OK'), )), /* Padding( // padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16 ), padding: EdgeInsets.only(left:75, bottom: 20, right: 70, top:10), child: TextFormField( cursorColor: greyColor, controller: nameController, decoration: const InputDecoration( border: UnderlineInputBorder(), labelText: 'Enter your username', ), ), ),*/ ], ); }); }, ); } }