How to make value stay despite leaving the page? - flutter

I am trying to make an edit page for users to update their details. I am able to edit the details. But when I leave the page the values go back to the original value it was before editing. How do I make the value stay?
Here is how the screen looks like -
Screen Picture
I did wrap the values in set state thinking that they would remain after leaving the page but they dont.
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:my_plate/screens/home_screen.dart';
import 'package:my_plate/screens/user_guide_screen.dart';
import 'package:my_plate/widgets/app_drawer.dart';
class EditProfilePage extends StatefulWidget {
static String routeName = '/profile';
#override
_EditProfilePageState createState() => _EditProfilePageState();
}
class _EditProfilePageState extends State<EditProfilePage> {
final myController = TextEditingController();
final myController1 = TextEditingController();
String name = 'carolyn1234';
String email = 'carolyn#gmail.com';
final formKey = GlobalKey<FormState>();
#override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true,
appBar: AppBar(
title: Text('Profile'),
backgroundColor: Color(0xff588157),
elevation: 1,
// leading: IconButton(
// icon: Icon(
// Icons.arrow_back,
// color: Colors.white,
// ),
// onPressed: () {
// Navigator.of(context).pushNamed(MainScreen.routeName);
// },
// ),
actions: [
IconButton(
icon: Icon(Icons.library_books_outlined),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserGuideListScreen(),
));
},
),
],
),
body: Container(
padding: EdgeInsets.only(left: 16, top: 25, right: 16),
child: GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: Form(
key: formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: ListView(
children: [
Text(
"Profile",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 25, fontWeight: FontWeight.w800),
),
SizedBox(
height: 15,
),
Center(
child: Stack(
children: [
Container(
width: 130,
height: 130,
decoration: BoxDecoration(
border: Border.all(
width: 4,
color: Theme.of(context)
.scaffoldBackgroundColor),
boxShadow: [
BoxShadow(
spreadRadius: 2,
blurRadius: 10,
color: Colors.black.withOpacity(0.1),
offset: Offset(0, 10))
],
shape: BoxShape.circle,
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
"https://i.postimg.cc/gj4CDtjX/image.png",
))),
),
Positioned(
bottom: 0,
right: 0,
child: Container(
height: 40,
width: 40,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
width: 4,
color:
Theme.of(context).scaffoldBackgroundColor,
),
color: Color(0xff588157),
),
child: Icon(
Icons.edit,
color: Colors.white,
),
)),
],
),
),
SizedBox(
height: 35,
),
Text(
'User Details',
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
),
SizedBox(height: 10),
Text('Username',
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
color: Colors.black54)),
SizedBox(height: 5),
Container(
child: Text(name),
// margin: const EdgeInsets.all(2.0),
padding: const EdgeInsets.all(10.0),
width: 2000,
decoration: BoxDecoration(
border: Border.all(color: Colors.blueGrey)),
alignment: Alignment.topLeft,
),
SizedBox(height: 10),
Text('Email',
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
color: Colors.black54)),
SizedBox(height: 5),
Container(
child: Text(email),
// margin: const EdgeInsets.all(2.0),
padding: const EdgeInsets.all(10.0),
width: 2000,
decoration: BoxDecoration(
border: Border.all(color: Colors.blueGrey)),
alignment: Alignment.topLeft,
),
SizedBox(
height: 35,
),
Text(
'Edit Details',
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
),
SizedBox(
height: 15,
),
TextFormField(
controller: myController,
// initialValue: 'bla123',
// enabled: false,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0xff588157),
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0xff588157),
width: 0.0,
),
),
label: Text('Username',
style: TextStyle(color: Colors.black)),
),
validator: (username) {
if (username == null || username.isEmpty)
return 'Field is required.';
else if (username.length < 8)
return 'Please enter a description that is at least 8 characters.';
else
return null;
},
),
SizedBox(
height: 15,
),
TextFormField(
controller: myController1,
// initialValue: 'bla#gmail.com',
// enabled: false,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0xff588157),
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Color(0xff588157),
width: 0.0,
),
),
label:
Text('Email', style: TextStyle(color: Colors.black)),
),
validator: (email) {
if (email == null || email.isEmpty)
return 'Field is required.';
String pattern = r'\w+#\w+\.\w+';
if (!RegExp(pattern).hasMatch(email))
return 'Invalid E-mail Address format.';
return null;
},
),
// DropdownButtonFormField(
// // onChanged: null,
// hint: Text('Female'),
// decoration: InputDecoration(
// label: Text('Gender'),
// ),
// items: [
// DropdownMenuItem(child: Text('Female'), value: 'female'),
// DropdownMenuItem(child: Text('Male'), value: 'male'),
// ],
// onChanged: (String? value) {},
// ),
SizedBox(
height: 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
onPressed: () {
final isValidForm = formKey.currentState!.validate();
if (isValidForm) {
setState(() {
name = myController.text;
email = myController1.text;
});
}
setState(() {
// name = myController.text;
// email = myController1.text;
});
},
color: Color(0xff588157),
padding: EdgeInsets.symmetric(horizontal: 30),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20)),
child: Text(
"Update Details",
style: TextStyle(
fontSize: 15,
letterSpacing: 2.2,
color: Colors.white),
),
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
onPressed: () {
showAlertDialog();
// setState(() {
//
//
// // name = myController.text;
// // email = myController1.text;
// });
},
color: Color(0xff588157),
padding: EdgeInsets.symmetric(horizontal: 30),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20)),
child: Text(
"Delete Account",
style: TextStyle(
fontSize: 15,
letterSpacing: 2.2,
color: Colors.white),
),
)
],
)
],
),
),
),
),
drawer: AppDrawer());
}
void showAlertDialog() {
// set up the buttons
Widget cancelButton = TextButton(
child: Text("No", style: TextStyle(color: Color(0xff588157))),
onPressed: () {
Navigator.pop(context);
},
);
Widget continueButton = TextButton(
child: Text("Yes", style: TextStyle(color: Color(0xff588157))),
onPressed: () {
setState(() {
name = '';
email = '';
});
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Account deleted successfully!'),
));
Navigator.pop(context);
},
);
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: Text("AlertDialog"),
content: Text("Are you sure you want to submit this form?"),
actions: [
cancelButton,
continueButton,
],
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
}

Related

How to make container fixed. the container wont resize after clicking the widgets inside it . Flutter

I am having trouble with my design as i want this container as a background for my dropdowns and textformfield. but its changing its size once i click on description or dates.
Please help how to make it fixed. i have attached some screenshots also of before and after clicking the formfield.
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
// color: Colors.white,
padding: const EdgeInsets.all(32.5),
constraints: const BoxConstraints(
minWidth: 0, maxWidth: 350, minHeight: 0, maxHeight: 440),
child: Column(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
height: 52,
width: 270,
padding: const EdgeInsets.symmetric(horizontal: 5.0),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
child: DropdownButtonHideUnderline(
child: DropdownButton(
hint: const Text('Select Chapter'),
items: chapteritemlist.map((item) {
return DropdownMenuItem(
value: item['chapterId'].toString(),
child: Text(item['chapter'].toString()),
);
}).toList(),
onChanged: (newVal) {
setState(() {
dropdownchapterdisplay = newVal;
});
chaptid = newVal;
print(chaptid);
getAllMember();
},
value: dropdownchapterdisplay,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
height: 52,
width: 270,
padding: EdgeInsets.symmetric(horizontal: 0),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
child: DropdownButtonHideUnderline(
child: DropdownButton(
hint: const Text('Select Member'),
items: memberitemlist.map((item) {
return DropdownMenuItem(
value: item['id'].toString(),
child: Text(
item['name'].toString(),
style: const TextStyle(
fontSize: 9,
),
),
);
}).toList(),
onChanged: (newVal) {
setState(() {
dropdownmemberdisplay = newVal;
});
memberid = newVal;
},
value: dropdownmemberdisplay,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: SizedBox(
height: 48,
width: 270,
child: TextFormField(
// The validator receives the text that the user has entered.
// textAlign: TextAlign.center,
controller: description,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
hintText: "Description",
filled: true,
fillColor: Colors.grey[200],
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: SizedBox(
height: 88,
width: 270,
child: DateTimeFormField(
decoration: InputDecoration(
hintStyle: const TextStyle(color: Colors.black),
errorStyle: const TextStyle(color: Colors.redAccent),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
hintText: 'MM DD, YYYY',
filled: true,
fillColor: Colors.grey[200],
suffixIcon: const Icon(Icons.event_note),
labelText: 'Select Date',
),
mode: DateTimeFieldPickerMode.date,
autovalidateMode: AutovalidateMode.always,
validator: (e) => (e?.day ?? 0) == 1
? 'Please not the first day'
: null,
onDateSelected: (DateTime value) {},
),
),
),
),
Padding(
padding: const EdgeInsets.all(2.0),
child: Row(children: <Widget>[
Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
alignment: Alignment.bottomLeft,
child: ElevatedButton(
onPressed: () {
saveRequestModel = SaveClass();
saveRequestModel.Description = description.text;
saveRequestModel.UserName = global_Email;
saveRequestModel.Id = 0;
saveRequestModel.toFId = 0;
saveRequestModel.ToSelf = 0;
saveRequestModel.TranType = 0;
saveRequestModel.ToId = 6;
saveRequestModel.MeetingDate = '2022-10-02';
print(saveRequestModel.ToId);
SaveService saveService = SaveService();
saveService.save(saveRequestModel).then((value) {
print("data saved");
});
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.deepPurple[900],
textStyle: const TextStyle(
color: Colors.white,
fontSize: 25,
fontStyle: FontStyle.normal),
),
// color: Colors.deepPurple[900],
// textColor: Colors.white,
// elevation: 5,
child: const Text('Save',
style: TextStyle(fontSize: 20)),
),
),
),
Padding(
padding: const EdgeInsets.only(left: 20),
child: Align(
alignment: Alignment.bottomRight,
child: ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.deepPurple[900],
textStyle: const TextStyle(
color: Colors.white,
fontSize: 25,
fontStyle: FontStyle.normal),
),
// color: Colors.deepPurple[900],
// textColor: Colors.white,
// elevation: 5,
child: const Text('Check Report',
style: TextStyle(fontSize: 20)),
),
))
]),
),
],
)),
Here is the full code.
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:date_field/date_field.dart';
//import 'package:saarthi/api/saarthi_meeting/chapter_api.dart';
import 'package:saarthi/api/saarthi_meeting/sarthi_services.dart';
import 'package:http/http.dart' as http;
import 'package:saarthi/api/saarthi_meeting/save_button.dart';
import 'package:saarthi/model/saarthi_meeting/saarthi_model.dart';
import 'package:saarthi/model/saarthi_meeting/save_model.dart';
import 'package:saarthi/variables.dart';
void main() {
runApp(Saarthi_Meeting());
}
class Saarthi_Meeting extends StatelessWidget {
Saarthi_Meeting({Key? key}) : super(key: key);
String value = "";
String url = '';
#override
Widget build(BuildContext context) {
return const MaterialApp(
home: datadisplay(),
debugShowCheckedModeBanner: false,
);
}
}
class datadisplay extends StatefulWidget {
const datadisplay({Key? key}) : super(key: key);
#override
State<datadisplay> createState() => _datadisplayState();
}
class _datadisplayState extends State<datadisplay> {
final SaarthiService _fetchdata = SaarthiService();
#override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.deepPurple[900],
appBar: AppBar(
title: Image.asset('assets/images/CG.png', width: 200),
backgroundColor: Colors.deepPurple[900],
elevation: 13,
actions: [
IconButton(
onPressed: () {
Navigator.push(
context, MaterialPageRoute(builder: (context) => smdesign()));
},
icon: const Icon(Icons.add),
)
],
),
body: Container(
padding: const EdgeInsets.all(20),
child: FutureBuilder<List<Saarthidata>>(
future: _fetchdata.smdata(),
builder: (context, snapshot) {
var data = snapshot.data;
return ListView.builder(
itemCount: data?.length,
itemBuilder: (context, index) {
if (!snapshot.hasData) {
return const Center(child: CircularProgressIndicator());
}
return Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ListTile(
onTap: () {
if (data?[index].id != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => smdesign(),
),
);
}
},
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'On Date - ${data?[index].date}',
style: const TextStyle(
fontSize: 10,
fontWeight: FontWeight.w600),
),
const SizedBox(height: 10),
Text(
'From User - ${data?[index].fromName}',
style: const TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 10),
Text(
'To User - ${data?[index].toName}',
style: const TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 10),
]),
),
),
);
});
}),
),
);
}
}
class smdesign extends StatefulWidget {
smdesign({Key? key}) : super(key: key);
#override
State<smdesign> createState() => _smdesignState();
}
class _smdesignState extends State<smdesign> {
String? dropdownvalue = "Self";
String chaptervalue = "One";
bool isVisible = false;
//---------------------variable----------------------------------------------------API
List chapteritemlist = [];
var dropdownchapterdisplay;
//---------------------variable----------------------------------------------------API
List memberitemlist = [];
var dropdownmemberdisplay;
//------------------------------api dropdown 3 ---------------------------------
//--------------------------------------------------------------------------API
//----------------------------------save-------------------save--------------------------
late SaveClass saveRequestModel;
var description = TextEditingController();
//----------------------------------save-------------------save--------------------------
#override
void initState() {
super.initState();
getAllChapter();
}
#override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.deepPurple[900],
appBar: AppBar(
title: Image.asset('assets/images/CG.png', width: 200),
backgroundColor: Colors.deepPurple[900],
elevation: 13,
),
body: Center(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
// color: Colors.white,
padding: const EdgeInsets.all(32.5),
constraints: const BoxConstraints(
minWidth: 0, maxWidth: 350, minHeight: 0, maxHeight: 440),
child: Column(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
height: 52,
width: 270,
padding: const EdgeInsets.symmetric(horizontal: 5.0),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
child: DropdownButtonHideUnderline(
child: DropdownButton(
hint: const Text('Select Chapter'),
items: chapteritemlist.map((item) {
return DropdownMenuItem(
value: item['chapterId'].toString(),
child: Text(item['chapter'].toString()),
);
}).toList(),
onChanged: (newVal) {
setState(() {
dropdownchapterdisplay = newVal;
});
chaptid = newVal;
print(chaptid);
getAllMember();
},
value: dropdownchapterdisplay,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: Container(
height: 52,
width: 270,
padding: EdgeInsets.symmetric(horizontal: 0),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(20.0),
border: Border.all(
// color: Colors.black,
style: BorderStyle.solid,
width: 1.0),
),
child: DropdownButtonHideUnderline(
child: DropdownButton(
hint: const Text('Select Member'),
items: memberitemlist.map((item) {
return DropdownMenuItem(
value: item['id'].toString(),
child: Text(
item['name'].toString(),
style: const TextStyle(
fontSize: 9,
),
),
);
}).toList(),
onChanged: (newVal) {
setState(() {
dropdownmemberdisplay = newVal;
});
memberid = newVal;
},
value: dropdownmemberdisplay,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: SizedBox(
height: 48,
width: 270,
child: TextFormField(
// The validator receives the text that the user has entered.
// textAlign: TextAlign.center,
controller: description,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
hintText: "Description",
filled: true,
fillColor: Colors.grey[200],
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(5.0),
child: SizedBox(
height: 88,
width: 270,
child: DateTimeFormField(
decoration: InputDecoration(
hintStyle: const TextStyle(color: Colors.black),
errorStyle: const TextStyle(color: Colors.redAccent),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
hintText: 'MM DD, YYYY',
filled: true,
fillColor: Colors.grey[200],
suffixIcon: const Icon(Icons.event_note),
labelText: 'Select Date',
),
mode: DateTimeFieldPickerMode.date,
autovalidateMode: AutovalidateMode.always,
validator: (e) => (e?.day ?? 0) == 1
? 'Please not the first day'
: null,
onDateSelected: (DateTime value) {},
),
),
),
),
Padding(
padding: const EdgeInsets.all(2.0),
child: Row(children: <Widget>[
Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
alignment: Alignment.bottomLeft,
child: ElevatedButton(
onPressed: () {
saveRequestModel = SaveClass();
saveRequestModel.Description = description.text;
saveRequestModel.UserName = global_Email;
saveRequestModel.Id = 0;
saveRequestModel.toFId = 0;
saveRequestModel.ToSelf = 0;
saveRequestModel.TranType = 0;
saveRequestModel.ToId = 6;
saveRequestModel.MeetingDate = '2022-10-02';
print(saveRequestModel.ToId);
SaveService saveService = SaveService();
saveService.save(saveRequestModel).then((value) {
print("data saved");
});
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.deepPurple[900],
textStyle: const TextStyle(
color: Colors.white,
fontSize: 25,
fontStyle: FontStyle.normal),
),
// color: Colors.deepPurple[900],
// textColor: Colors.white,
// elevation: 5,
child: const Text('Save',
style: TextStyle(fontSize: 20)),
),
),
),
Padding(
padding: const EdgeInsets.only(left: 20),
child: Align(
alignment: Alignment.bottomRight,
child: ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.deepPurple[900],
textStyle: const TextStyle(
color: Colors.white,
font size: 25,
fontStyle: FontStyle.normal),
),
// color: Colors.deepPurple[900],
// textColor: Colors.white,
// elevation: 5,
child: const Text('Check Report',
style: TextStyle(fontSize: 20)),
),
))
]),
),
],
)),
),
);
}
}
Before Image -This is before clicking anything. The design
After Image -when I click on the description form field it shows like this.

HERE map is Overlap my Material App in Flutter

body: GetBuilder<InitialScreenController>(
builder: (logic) => SafeArea(
child: Column(
children: [
Expanded(
child: Stack(
alignment: AlignmentDirectional.centerEnd,
children: [
Container(
height: 90.w,
width: 70.h,
color: Colors.grey,
child: HereMap(onMapCreated: _onMapCreated,),
),
logic.getCurrentCargoModel != null
? Container()
: Padding(
padding: EdgeInsets.all(2.h),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
// height: 3.h,
width: 30.h,
child: TextField(
style: TextStyle(
color:Clr.black,
),
controller:tsearch,
onChanged: (value) {
// if (value.isNotEmpty) {
// idstatus = false;
// }
},
decoration: InputDecoration(
filled: true,
fillColor: Clr.white,
disabledBorder: InputBorder.none,
isDense: true,
prefixIcon: Image.asset(Ast.pin),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Clr.textfieldborder),
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5)),
// errorText: idstatus ? iderror : null,
contentPadding:
EdgeInsets.fromLTRB(20, 15, 20, 15),
// hintText: Str.categoryHint,
// hintStyle: TextStyle(
// fontSize: 12.sp,
// fontWeight: FontWeight.w400,
// // color: Clr.hintTexClr,
// ),
),
),
),
SizedBox(
width: 2.h,
),
ElevatedButton(
onPressed: () async {
// var position =
// await initialScreenController.determinePosition();
// print("---------->${position!.longitude.toString()}");
// print("---------->${position!.latitude.toString()}");
// await logic.getCurrentCargoData();
// Get.to(() => InitialMapScreen(position: position));
},
child: Text(
"kreni",
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
style: ElevatedButton.styleFrom(
elevation: 0,
fixedSize: Size(10.w, 7.w),
primary: Clr.mainColor),
),
],
),
],
),
),
GestureDetector(
onTap: () {
switch (controller!.status) {
case AnimationStatus.completed:
controller!.reverse();
break;
case AnimationStatus.dismissed:
controller!.forward();
break;
default:
}
},
child: Container(
height: 100.w,
width: 3.w,
decoration: BoxDecoration(
color: Clr.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0.w),
bottomLeft: Radius.circular(0.w))),
child: Image.asset(
Ast.menu,
color: Clr.darkBlack,
)),
),
_drawer(context),
],
),
),
],
),
),
),
);
}

Flutter: After refresing my data is showing

when I click on address textformField then a open a alert dialog box,In this alert dialog box I have Dropdown, when i choose any dropdown item then that time not showing data, when i refresh the page then my data is showing on dropdown show.
This is my code
import 'dart:convert';
import 'dart:io';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:http_interceptor/http/intercepted_client.dart';
import 'package:image_picker/image_picker.dart';
import 'package:multi_image_picker2/multi_image_picker2.dart';
import 'package:readmore/readmore.dart';
import 'package:http/http.dart' as http;
class ViewEditProfile extends StatefulWidget {
const ViewEditProfile({Key? key}) : super(key: key);
#override
_ViewEditProfileState createState() => _ViewEditProfileState();
}
class _ViewEditProfileState extends State<ViewEditProfile> {
var _fullNameController = TextEditingController();
var _emailController = TextEditingController();
var _dobController = TextEditingController();
var _genderController = TextEditingController();
var _addressController = TextEditingController();
var _adharController = TextEditingController();
var _panController = TextEditingController();
var userPhoneNumber;
List? stateList = [];
List? districtList = [];
List? tehsilList = [];
List? villageList = [];
String? _selectedState;
String? _selectedDistrict;
String? _selectedTehsil;
String? _selectedVillage;
DatabaseService db = DatabaseService();
#override
void initState() {
// TODO: implement initState
super.initState();
// _loadSharedPrefs();
getGeoPointsDetailsUsingType();
// genderFunct();
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbarNoSearch(),
body: SingleChildScrollView(
child: Container(
child: Column(
children: [
Container(
color: mPrimaryColor,
height: MediaQuery
.of(context)
.size
.height / 23,
width: MediaQuery
.of(context)
.size
.width,
child: Row(
children: [
SizedBox(
width: 15,
),
InkWell(
onTap: () {
Navigator.pop(context);
},
child: Container(
height: MediaQuery
.of(context)
.size
.height / 23,
width: 30,
child: Icon(
Icons.arrow_back_ios_rounded,
size: 20,
color: whitetext,
),
),
),
Expanded(
child: Text(
"VIEW EDIT PROFILE".tr(),
style: headingWhite(),
textAlign: TextAlign.center,
),
),
SizedBox(
width: 40,
)
],
),
),
Container(
height: MediaQuery
.of(context)
.size
.height / 3.9,
width: MediaQuery
.of(context)
.size
.width,
// width: 110,
// height: 110,
decoration: BoxDecoration(boxShadow: [
BoxShadow(
color: grey,
offset: const Offset(
0,
5.0,
),
blurRadius: 5.0,
spreadRadius: 0,
), //BoxShadow
BoxShadow(
color: Colors.white,
offset: const Offset(0.0, 0.0),
blurRadius: 0.0,
spreadRadius: 0.0,
), //BoxShadow
]),
child: Column(
children: [
Container(
padding: EdgeInsets.only(top: 7, right: 15),
child: GestureDetector(
onTap: () {
isEnableFun(context);
},
child: Container(
height: 24,
child: Align(
alignment: Alignment.topRight,
child: isEnable
? Text(
'UPDATE',
style: cardTitleGreen(),
)
: Text(
'EDIT',
style: cardTitleGreen(),
),
),
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.all(2),
width: 120,
height: 120,
decoration: BoxDecoration(
border:
Border.all(color: mPrimaryColor, width: 1.0),
borderRadius: BorderRadius.circular(60),
),
child: isEnable == false
? Container(
margin: EdgeInsets.all(1),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(60),
image: DecorationImage(
image: NetworkImage(
"https://www.aiyd.org/wp-content/uploads/2016/09/no-image-icon-hi-1.png"),
fit: BoxFit.cover)),
)
: Stack(
children: [
Container(
margin: EdgeInsets.all(1),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(60),
image: DecorationImage(
image: NetworkImage(
"https://www.aiyd.org/wp-content/uploads/2016/09/no-image-icon-hi-1.png"),
fit: BoxFit.cover)),
),
Positioned(
top: 0,
right: 0,
child: InkWell(
onTap: () {
// shopLogoLoadAssets();
getImage();
},
child: Container(
height: 40,
width: 40,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
width: 4, color: Colors.white),
color: mPrimaryColor,
),
child: Icon(
Icons.edit,
color: Colors.white,
),
),
),
),
],
),
),
SizedBox(
width: 25,
),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
//star address part
Padding(
padding: const EdgeInsets.only(
top: 14, left: 23, right: 23),
child: Theme(
data: ThemeData(
disabledColor: cardTextbgYellow,
),
child: TextFormField(
readOnly: true,
controller: _addressController,
minLines: 2,
maxLines: 3,
keyboardType: TextInputType.multiline,
cursorColor: mPrimaryColor,
style: TextStyle(color: mPrimaryColor),
enabled: isEnable,
decoration: InputDecoration(
prefixIconConstraints: BoxConstraints(
minWidth: 23,
),
prefixIcon: Padding(
padding: const EdgeInsets.only(
right: 17,
),
child: Icon(
Icons.location_on_outlined,
color: mPrimaryColor,
),
),
hintText: "Your Address",
hintStyle: cardTitleGreen(),
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: cardTextbg.withOpacity(0.5)),
),
focusedBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: cardTextbg.withOpacity(0.5)),
),
),
onTap: () {
setState(() {
showAddressDialog();
});
},
),
),
),
//end address partpan part
SizedBox(
height: 20,
),
isEnable
? CustomButton(
text: "SAVE".tr(),
textColor: Colors.white,
gradient: buttongradient,
icon: Icons.arrow_forward_ios_outlined,
iconColor: Colors.white,
onPressed: () {},
)
: Container(),
SizedBox(
height: 20,
),
],
)
],),
] ),),]),)
)
,
);
}
getGeoPointsDetailsUsingType() async {
db.getGeoPointDetailsByType("State").then((onValue) =>
{
setState(() {
stateList = onValue;
print("line 1");
print("object::: " + stateList!.length.toString());
print("line 2");
})
});
}
getGeoPointsDetailsUsingId(String id, String type) async {
db.getGeoPointDetailsById(id).then((onValue) =>
{
print(type),
setState(() {
print("id:: " + id);
if (type == "District") {
districtList = onValue;
print("districtList:: " + districtList.toString());
} else if (type == "Tehsil") {
tehsilList = onValue;
} else if (type == "VillagePanchayat") {
villageList = onValue;
}
})
});
}
showAddressDialog() {
showDialog(
barrierDismissible: false,
context: context,
builder: (context) =>
AlertDialog(
insetPadding: EdgeInsets.symmetric(horizontal: 10),
scrollable: true,
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CustomButton2(
text: "OK",
onPressed: () {
Navigator.of(context).pop();
},
gradient: buttongradient,
)
],
)
],
content: Container(
width: MediaQuery
.of(context)
.size
.width,
child: Column(
children: [
Row(
children: [
Expanded(
child: Container(
height: 30,
padding:
EdgeInsets.only(top: 0, left: 4, bottom: 0),
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
bottomLeft: Radius.circular(8)),
border: Border.all(
color: mPrimaryColorLight, width: 0.5)),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
focusColor: Colors.red,
hint: Text(
"State".tr(),
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: _selectedState,
isExpanded: true,
elevation: 2,
icon: Icon(
// Add this
Icons.arrow_drop_down, // Add this
color: mPrimaryColorLight, // Add this
),
items: stateList!.length > 0
? List.generate(
stateList!.length,
(index) =>
DropdownMenuItem<String>(
value:
"${stateList![index]['referenceId']}",
child: new Text(
stateList![index]['name'],
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
),
)
: ["Select State"].map((option) {
return DropdownMenuItem(
child: Text(
"$option",
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: option,
);
}).toList(),
onChanged: (String? val) {
setState(() {
_selectedState = val;
print(_selectedState);
if (stateList!.length > 0) {
getGeoPointsDetailsUsingId(
_selectedState!, "District");
}
});
},
),
),
),
),
Expanded(
child: Container(
height: 30,
padding:
EdgeInsets.only(top: 0, left: 4, bottom: 0),
decoration: BoxDecoration(
border: Border.all(
color: mPrimaryColorLight, width: 0.5)),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
focusColor: Colors.red,
hint: Text(
"District".tr(),
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: _selectedDistrict,
icon: Icon(
// Add this
Icons.arrow_drop_down, // Add this
color: mPrimaryColorLight, // Add this
),
isExpanded: true,
elevation: 2,
items: districtList!.length > 0
? List.generate(
districtList!.length,
(index) =>
DropdownMenuItem<String>(
value:
"${districtList![index]['referenceId']}",
child: new Text(
districtList?[index]['name'],
style: TextStyle(
fontSize: 13,
fontWeight:
FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
))
: ["Select District"].map((option) {
return DropdownMenuItem(
child: Text(
"$option",
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: option,
);
}).toList(),
onChanged: (String? val) {
setState(() {
_selectedDistrict = val;
if (districtList!.length > 0) {
getGeoPointsDetailsUsingId(
_selectedDistrict!, "Tehsil");
}
});
},
),
),
),
),
Expanded(
child: Container(
height: 30,
padding:
EdgeInsets.only(top: 0, left: 4, bottom: 0),
decoration: BoxDecoration(
border: Border.all(
color: mPrimaryColorLight, width: 0.5)),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
focusColor: Colors.red,
hint: Text(
"Tehsil".tr(),
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: _selectedTehsil,
isExpanded: true,
elevation: 2,
icon: Icon(
// Add this
Icons.arrow_drop_down, // Add this
color: mPrimaryColorLight, // Add this
),
items: tehsilList!.length > 0
? List.generate(
tehsilList!.length,
(index) =>
DropdownMenuItem<String>(
value:
"${tehsilList![index]['referenceId']}",
child: new Text(
tehsilList![index]['name'],
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
)))
: ["Select Tehsil"].map((option) {
return DropdownMenuItem(
child: Text(
"$option",
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: option,
);
}).toList(),
onChanged: (String? val) {
setState(() {
_selectedTehsil = val;
if (tehsilList!.length > 0) {
getGeoPointsDetailsUsingId(
_selectedTehsil!, "VillagePanchayat");
}
});
},
),
),
),
),
Expanded(
child: Container(
height: 30,
padding:
EdgeInsets.only(top: 0, left: 4, bottom: 0),
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topRight: Radius.circular(8),
bottomRight: Radius.circular(8)),
border: Border.all(
color: mPrimaryColorLight, width: 0.5)),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
focusColor: Colors.red,
hint: Text(
"Village".tr(),
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: _selectedVillage,
isExpanded: true,
elevation: 2,
icon: Icon(
// Add this
Icons.arrow_drop_down, // Add this
color: mPrimaryColorLight, // Add this
),
items: villageList!.length > 0
? List.generate(
villageList!.length,
(index) =>
DropdownMenuItem<String>(
value:
"${villageList![index]['referenceId']}",
child: new Text(
villageList![index]['name'],
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
)))
: ["Select Village"].map((option) {
return DropdownMenuItem(
child: Text(
"$option",
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500),
overflow: TextOverflow.ellipsis,
),
value: option,
);
}).toList(),
onChanged: (String? val) {
setState(() {
_selectedVillage = val;
// getGeoPointsDetailsUsingId(
// _selectedVillage!);
});
},
),
),
),
),
],
),
SizedBox(
height: 5,
),
],
),
),
));
}
}
Try to wrap your dialog with StatefulBuilder
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
//Your AlertDialog
}

Flutter TextField hide by Keyboard

I'm a beginner in the flutter, I have a conflict, when I'm focusing on a TexFiled, the keyboard hidden over the TextField, and bottom button not showing i attached my conflict here
any solution for this
Thanks
code here
import 'dart:ui';
import 'package:crapp/pages/create_password/password_screen.dart';
import 'package:crapp/widgets/components/alert.dart';
import 'package:crapp/widgets/components/page_animation.dart';
import 'package:crapp/widgets/theme/constants.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:crapp/provider/theme_provider.dart';
class PasswordScreen extends StatefulWidget {
#override
_PasswordScreenState createState() => _PasswordScreenState();
}
class _PasswordScreenState extends State< PasswordScreen > {
final _controller = TextEditingController();
//validation controller
TextEditingController sQuastionController = new TextEditingController();
TextEditingController answerQController = new TextEditingController();
TextEditingController passController = new TextEditingController();
TextEditingController conPassController = new TextEditingController();
final TextEditingController _pass = TextEditingController();
final TextEditingController _confirmPass = TextEditingController();
bool _isButtonEnabled = false;
//final _controller = TextEditingController();
bool isConfirm=false;
check (BuildContext context){
if(sQuastionController.text.isNotEmpty &&
answerQController.text.isNotEmpty &&
conPassController.text.isNotEmpty &&
passController.text.isNotEmpty){
setState(() {
_isButtonEnabled = true;
});
} else {
setState(() {
_isButtonEnabled = false;
});
}
}
checks (BuildContext context){
if(passController.text.isEmpty){
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return Alert(title: "Alert !!!",subTile: "Password must be 10 characters !",);
}
);
}else if(passController.text.length > 0 && passController.text.length < 10){
isConfirm = true;
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return Alert(title: "Alert !!!",subTile: "Password doesn't match !",);
}
);
}
}
checkChanged(){
if( secretVal != null
)
{
setState(() {
isSave = true;
});
}else{
isSave =false;
}
} bool isSave=false;
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
#override
Widget build(BuildContext context) {
/* double height = MediaQuery.of(context).size.height;
double width = MediaQuery.of(context).size.width;*/
Provider.of<ThemeProvider>(context).themeMode == ThemeMode.dark
? 'DarkTheme'
: 'LightTheme';
return Scaffold(
resizeToAvoidBottomInset: false,
body: SafeArea(
child: Column(
children: <Widget>[
Expanded(
child: _signUp(),
),
],
),
), bottomNavigationBar: BottomAppBar(
elevation: 4,
child: Container(
height: 70,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Row(
children: [
Expanded(
child: MaterialButton(
height: 44,
onPressed: () {
FocusScope.of(context).requestFocus(FocusNode());
//check();
},
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(4)),
color: Color(0xFF2A3476),
elevation: 0,
highlightElevation: 0,
child: Container(
child: Text(
"Save",
style: TextStyle(
color: Color(0xFF2A3476),
fontSize: 15,
fontFamily: 'medium'),
),
),
),
),
],
),
),
),
),
/* bottomNavigationBar: Container(
padding: EdgeInsets.all(25.0),
decoration: BoxDecoration(color: Colors.white,
),
child: Row(
children: [
Expanded(
child: MaterialButton(
height: 44,
onPressed: () {
FocusScope.of(context).requestFocus(FocusNode());
*//* Navigator.push(context, SlidePageRoute(page:PasswordScreen()));*//*
},
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
color: _isButtonEnabled ? Color(0xFF2A3476) : Color(0x201E1E99),
elevation: 0,
highlightElevation: 0,
child: Container(
child: Text(
"Next",
style: TextStyle(color: m_fillColor,fontSize: 18,fontWeight: FontWeight.w600 ,
fontFamily: "regular",),
),
),
),
),
],
),
)*/
);
}
Widget _signUp() {
return Container(
constraints: BoxConstraints.expand(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xFF2A3476),
Color(0xFF2A3476),
],
begin: Alignment.topLeft,
end: Alignment.centerRight,
),
),
child: Form(
key: formKey,
child: Container(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding:
const EdgeInsets.symmetric(vertical: 36.0, horizontal: 24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Create Password",
style: TextStyle(
color: Colors.white,
fontSize: 30.0,fontFamily: "medium",
fontWeight: FontWeight.w800,
),
),
],
),
),
Container(
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30),
topRight: Radius.circular(30),
),
),
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Steps to set your",
style: TextStyle(
fontSize: 22,
fontFamily: "regular",
fontWeight: FontWeight.w300,
color: Colors.black,
),
),
Text(
"password",
style: TextStyle(
fontSize: 22,
fontFamily: "regular",
fontWeight: FontWeight.w300,
color: Colors.black,
),
),
SizedBox(
height: 20.0,
), Text(
'Secret Question',
style:
TextStyle( fontSize: 15,
fontFamily: "regular",),
), SizedBox(
height: 8.0,
),
Row(
children: [
Expanded(child: InkWell(
onTap: (){
FocusScope.of(context).requestFocus(FocusNode());
secretDialogue();
},
child: Stack(
children: <Widget>[
TextField(
/* textInputAction: TextInputAction.next,*/
controller: sQuastionController,
enabled: false,
onChanged: (val) {
check(context);
},
decoration: InputDecoration(
labelText: secretVal==null?"Select One":secretVal,
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius:
BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "",
/* prefixIcon: Icon(
Icons.people_outline_rounded,
color: Colors.grey[600],
)*/
),
),
Positioned.directional(
textDirection: Directionality.of(context),
end: 0,
top: 0,
bottom: 0,
child: Padding(
padding: const EdgeInsets.all(8.0),
child:Image.asset(
"assets/icons/ic_drop_arrow.png",
scale: 9,
)),
)
],
),
),
),
],
),
SizedBox(
height: 20.0,
),
Text(
'Answer',
style:
TextStyle( fontSize: 15,
fontFamily: "regular",),
),
SizedBox(
height: 8.0,
),
TextField(
/* keyboardType: TextInputType.emailAddress,*/
/* textInputAction: TextInputAction.next,*/
controller: answerQController,
onChanged: (val){
check(context);
},
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "",
/*prefixIcon: Icon(
Icons.people_outline_rounded,
color: Color(0xFFE1E8F7),
)*/),
),
SizedBox(
height: 20.0,
),
Text(
'Password',
style:
TextStyle( fontSize: 15,
fontFamily: "regular",),
),
SizedBox(
height: 8.0,
),
TextFormField(
/* keyboardType: TextInputType.emailAddress,*/
/* textInputAction: TextInputAction.next,*/
controller: passController,
onChanged: (val){
check(context);
},
//password validation
/* validator: (val){
if(val!.isEmpty)
return 'Empty';
return null;
},*/
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "************",
),
),
SizedBox(
height: 20.0,
),
Text(
'Confirm Password',
style:
TextStyle( fontSize: 15,
fontFamily: "regular",),
),
SizedBox(
height: 8.0,
),
TextFormField(
textInputAction: TextInputAction.done,
controller: conPassController,
onChanged: (val){
check(context);
},
//password validation
/* validator: (val){
if(val!.isEmpty)
return 'Empty';
if(val != _pass.text)
return 'Not Match';
return null;
},*/
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "************",
),
),
SizedBox(
height: 20.0,
),
SizedBox(
height: 8.0,
),
SizedBox(
height:200.0,
),
],
),
),
),
],
),
),
),
),
);
}
//
//Secret Qu Alert
List secretList =[
"-What’s your favorite team?",
"-What’s your astrological sign?",
"-What’s your favorite movie?",
"-What city were you born in?",
"-What was your first car?",
];
var secretVal;
void secretDialogue(){
showDialog<void>(
context: context,
// false = user must tap button, true = tap outside dialog
builder: (BuildContext dialogContext) {
return StatefulBuilder(
builder: (context,setState){
return Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
insetPadding: EdgeInsets.all(20),
child: Container(
padding: EdgeInsets.symmetric(vertical: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(secretList.length, (index){
return InkWell(
onTap: (){
setState(() {
secretVal = secretList[index];
Navigator.pop(context);
});
},
child: Container(
height: 50,
padding: EdgeInsets.symmetric(horizontal: 20),
alignment: Alignment.centerLeft,
child: Text(secretList[index],
style: TextStyle(
fontSize: 18,
fontFamily: "medium",
),),
),
);
})
),
),
);
}
);
},
);
}
}
Wrap your Column by SingleChildScrollView. It will solve your problem.
like this..
body: SafeArea(
child: SingleChildScrollView(
child: Column(
Also I think after this there is no need of
resizeToAvoidBottomInset: false,
in Scaffold.
Please check out and I have found some inconsistency in code, refactored some of them
import 'dart:ui';
import 'package:crapp/pages/create_password/password_screen.dart';
import 'package:crapp/widgets/components/alert.dart';
import 'package:crapp/widgets/components/page_animation.dart';
import 'package:crapp/widgets/theme/constants.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:crapp/provider/theme_provider.dart';
class PasswordScreen extends StatefulWidget {
#override
_PasswordScreenState createState() => _PasswordScreenState();
}
class _PasswordScreenState extends State< PasswordScreen > {
final _controller = TextEditingController();
//validation controller
TextEditingController sQuastionController = new TextEditingController();
TextEditingController answerQController = new TextEditingController();
TextEditingController passController = new TextEditingController();
TextEditingController conPassController = new TextEditingController();
final TextEditingController _pass = TextEditingController();
final TextEditingController _confirmPass = TextEditingController();
bool _isButtonEnabled = false;
//final _controller = TextEditingController();
bool isConfirm = false;
check(BuildContext context) {
if (sQuastionController.text.isNotEmpty &&
answerQController.text.isNotEmpty &&
conPassController.text.isNotEmpty &&
passController.text.isNotEmpty) {
setState(() {
_isButtonEnabled = true;
});
} else {
setState(() {
_isButtonEnabled = false;
});
}
}
void initState() {
SystemChannels.textInput.invokeMethod('TextInput.hide');
super.initState();
}
checks (BuildContext context){
if(passController.text.isEmpty){
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return Alert(title: "Alert !!!",subTile: "Password must be 10 characters !",);
}
);
}else if(passController.text.length > 0 && passController.text.length < 10){
isConfirm = true;
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return Alert(title: "Alert !!!",subTile: "Password doesn't match !",);
}
);
}
}
checkChanged() {
if (secretVal != null) {
setState(() {
isSave = true;
});
} else {
isSave = false;
}
}
bool isSave = false;
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
#override
Widget build(BuildContext context) {
/* double height = MediaQuery.of(context).size.height;
double width = MediaQuery.of(context).size.width;*/
Provider.of<ThemeProvider>(context).themeMode == ThemeMode.dark
? 'DarkTheme'
: 'LightTheme';
return Scaffold(
// resizeToAvoidBottomInset: false,
body: _signUp(),
bottomNavigationBar: BottomAppBar(
elevation: 4,
child: Container(
height: 70,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Row(
children: [
Expanded(
child: MaterialButton(
height: 44,
onPressed: () {
FocusScope.of(context).requestFocus(FocusNode());
//check();
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4)),
color: Color(0xFF2A3476),
elevation: 0,
highlightElevation: 0,
child: Container(
child: Text(
"Save",
style: TextStyle(
color: Color(0xFF2A3476),
fontSize: 15,
fontFamily: 'medium'),
),
),
),
),
],
),
),
),
),
/* bottomNavigationBar: Container(
padding: EdgeInsets.all(25.0),
decoration: BoxDecoration(color: Colors.white,
),
child: Row(
children: [
Expanded(
child: MaterialButton(
height: 44,
onPressed: () {
FocusScope.of(context).requestFocus(FocusNode());
*/ /* Navigator.push(context, SlidePageRoute(page:PasswordScreen()));*/ /*
},
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
color: _isButtonEnabled ? Color(0xFF2A3476) : Color(0x201E1E99),
elevation: 0,
highlightElevation: 0,
child: Container(
child: Text(
"Next",
style: TextStyle(color: m_fillColor,fontSize: 18,fontWeight: FontWeight.w600 ,
fontFamily: "regular",),
),
),
),
),
],
),
)*/
);
}
Widget _signUp() {
return Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xFF2A3476),
Color(0xFF2A3476),
],
begin: Alignment.topLeft,
end: Alignment.centerRight,
),
),
child: SingleChildScrollView(
child: Form(
key: formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 36.0, horizontal: 24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Create Password",
style: TextStyle(
color: Colors.white,
fontSize: 30.0,
fontFamily: "medium",
fontWeight: FontWeight.w800,
),
),
],
),
),
Container(
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30),
topRight: Radius.circular(30),
),
),
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Steps to set your",
style: TextStyle(
fontSize: 22,
fontFamily: "regular",
fontWeight: FontWeight.w300,
color: Colors.black,
),
),
Text(
"password",
style: TextStyle(
fontSize: 22,
fontFamily: "regular",
fontWeight: FontWeight.w300,
color: Colors.black,
),
),
SizedBox(
height: 20.0,
),
Text(
'Secret Question',
style: TextStyle(
fontSize: 15,
fontFamily: "regular",
),
),
SizedBox(
height: 8.0,
),
Row(
children: [
Expanded(
child: InkWell(
onTap: () {
FocusScope.of(context)
.requestFocus(FocusNode());
secretDialogue();
},
child: Stack(
children: <Widget>[
TextField(
/* textInputAction: TextInputAction.next,*/
controller: sQuastionController,
enabled: false,
onChanged: (val) {
check(context);
},
decoration: InputDecoration(
labelText: secretVal == null
? "Select One"
: secretVal,
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius:
BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "",
/* prefixIcon: Icon(
Icons.people_outline_rounded,
color: Colors.grey[600],
)*/
),
),
Positioned.directional(
textDirection: Directionality.of(context),
end: 0,
top: 0,
bottom: 0,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
"assets/icons/ic_drop_arrow.png",
scale: 9,
)),
)
],
),
),
),
],
),
SizedBox(
height: 20.0,
),
Text(
'Answer',
style: TextStyle(
fontSize: 15,
fontFamily: "regular",
),
),
SizedBox(
height: 8.0,
),
GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
child: TextField(
/* keyboardType: TextInputType.emailAddress,*/
/* textInputAction: TextInputAction.next,*/
controller: answerQController,
onChanged: (val) {
check(context);
},
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "",
/*prefixIcon: Icon(
Icons.people_outline_rounded,
color: Color(0xFFE1E8F7),
)*/
),
),
),
SizedBox(
height: 20.0,
),
Text(
'Password',
style: TextStyle(
fontSize: 15,
fontFamily: "regular",
),
),
SizedBox(
height: 8.0,
),
GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
child: TextFormField(
/* keyboardType: TextInputType.emailAddress,*/
/* textInputAction: TextInputAction.next,*/
controller: passController,
onChanged: (val) {
check(context);
},
//password validation
/* validator: (val){
if(val!.isEmpty)
return 'Empty';
return null;
},*/
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "************",
),
),
),
SizedBox(
height: 20.0,
),
Text(
'Confirm Password',
style: TextStyle(
fontSize: 15,
fontFamily: "regular",
),
),
SizedBox(
height: 8.0,
),
GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
child: TextFormField(
textInputAction: TextInputAction.done,
controller: conPassController,
onChanged: (val) {
check(context);
},
//password validation
/* validator: (val){
if(val!.isEmpty)
return 'Empty';
if(val != _pass.text)
return 'Not Match';
return null;
},*/
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Color(0xFFE1E8F7),
hintText: "************",
),
),
),
SizedBox(
height: 20.0,
),
SizedBox(
height: 8.0,
),
SizedBox(
height: 200.0,
),
],
),
),
),
],
),
),
),
);
}
//
//Secret Qu Alert
List secretList = [
"-What’s your favorite team?",
"-What’s your astrological sign?",
"-What’s your favorite movie?",
"-What city were you born in?",
"-What was your first car?",
];
var secretVal;
void secretDialogue() {
showDialog<void>(
context: context,
// false = user must tap button, true = tap outside dialog
builder: (BuildContext dialogContext) {
return StatefulBuilder(builder: (context, setState) {
return Dialog(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
insetPadding: EdgeInsets.all(20),
child: Container(
padding: EdgeInsets.symmetric(vertical: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(secretList.length, (index) {
return InkWell(
onTap: () {
setState(() {
secretVal = secretList[index];
Navigator.pop(context);
});
},
child: Container(
height: 50,
padding: EdgeInsets.symmetric(horizontal: 20),
alignment: Alignment.centerLeft,
child: Text(
secretList[index],
style: TextStyle(
fontSize: 18,
fontFamily: "medium",
),
),
),
);
})),
),
);
});
},
);
}
}

Login and Signup form not validating

Login/Signup form is supposed to move to homepage on validation of the submit button (an arrow forward button icon) and if not validated, it ought to show a snackbar saying 'Error', but nothing works.
It keeps on giving this error message on button click "Another exception was thrown: NoSuchMethodError: The method 'validate' was called on null."
Here is my code:
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:community_material_icon/community_material_icon.dart';
import 'package:time_to_eat_devotionals/screens/home.dart';
import 'package:time_to_eat_devotionals/theme/palette.dart';
class LoginSignupScreen extends StatefulWidget {
#override
_LoginSignupScreenState createState() => _LoginSignupScreenState();
}
class _LoginSignupScreenState extends State<LoginSignupScreen> {
bool isSignUpScreen = true;
bool isRememberMe = false;
final _formkey = GlobalKey<FormState>();
TextEditingController usernameController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
TextEditingController nationalityController = TextEditingController();
var countryName = ['Nigeria', 'Ghana'];
#override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.yellow, Palette.backgroundColor]
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
body: Stack(
children: [
Positioned(
top: 0,
right: 0,
left: 0,
child: Container(
height: 300,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(isSignUpScreen? 'assets/images/signupbg.jpg' : 'assets/images/loginbg.jpg'),
fit: BoxFit.fill)),
child: Container(
padding: EdgeInsets.only(top: 90, left: 20),
color: Colors.black.withOpacity(.65),
child: Column(
children: [
RichText(
text: TextSpan(
text: isSignUpScreen? 'Welcome To' : 'Welcome Back',
style: TextStyle(
fontFamily: 'Raleway',
fontSize: 18,
color: Colors.white))),
Container(
height: 8.0,
),
Text(
'Time To Eat Devotionals',
style: TextStyle(
fontFamily: 'Kurale',
fontWeight: FontWeight.w600,
fontSize: 30.0,
color: Colors.white),
),
Container(
height: 8.0,
),
Text(
isSignUpScreen? 'Signup to continue': 'Login to continue',
style: TextStyle(
fontFamily: 'Raleway',
fontSize: 14.0,
color: Colors.white),
)
],
),
),
),
),
AnimatedPositioned(
duration: Duration(milliseconds: 700),
curve: Curves.bounceOut,
top: isSignUpScreen? 200 : 250,
child: AnimatedContainer(
duration: Duration(milliseconds: 700),
curve: Curves.bounceOut,
padding: EdgeInsets.only(top: 5, bottom: 20, right: 20, left: 20),
height: isSignUpScreen? 350 : 280,
width: MediaQuery.of(context).size.width - 40,
margin: EdgeInsets.symmetric(horizontal: 20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.3),
blurRadius: 15,
spreadRadius: 5)
]),
child: SingleChildScrollView(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
GestureDetector(
onTap: () {
setState(() {
isSignUpScreen = true;
});
},
child: Column(
children: [
Text(
"SIGNUP",
style: TextStyle(
fontFamily: 'baloo da 2',
fontSize: 21,
fontWeight: FontWeight.w500,
color: isSignUpScreen
? Palette.activeColor
: Colors.black),
),
if (isSignUpScreen)
Container(
margin: EdgeInsets.only(top: 1.0),
height: 2,
width: 55,
color: Colors.black,
)
],
),
),
GestureDetector(
onTap: () {
setState(() {
isSignUpScreen = false;
});
},
child: Column(
children: [
Text(
"LOGIN",
style: TextStyle(
fontFamily: 'baloo da 2',
fontSize: 21,
fontWeight: FontWeight.w500,
color: isSignUpScreen
? Colors.black
: Palette.activeColor),
),
if (!isSignUpScreen)
Container(
margin: EdgeInsets.only(top: 1.0),
height: 2,
width: 55,
color: Colors.black,
)
],
)),
],
),
isSignUpScreen?
Container(
key: _formkey,
margin: EdgeInsets.only(top: 10),
child: Column(
children: [
buidTextField(Icons.person, 'User Name', 'Enter your user name', false, false, usernameController, (username){
if (username.isEmpty) {
return 'Username is required';
} else if (username.length <6) {
return 'Username is short';
}
return null;
}),
buidTextField(Icons.email, 'Email', 'Enter your valid email address', false, true, emailController, (signupEmail){
if (signupEmail.isEmpty) {
return 'Email is required';
} else if (!signupEmail.contains('#')) {
return 'Please enter a valid email address';
}
return null;
}),
buidTextField(Icons.lock, 'Password', 'Enter your password', true, false, passwordController, (signupPword){
if (signupPword.isEmpty) {
return 'Password is required';
} else if (signupPword.length <8) {
return 'Password must be at least 8 characters';
}
return null;
}),
buidTextField(Icons.flag, 'Nationality', 'What country are you from', false, false, nationalityController, (nationality){
if (nationality.isEmpty) {
return 'Enter Your Nationality';
} else if (!nationality.contain(countryName)) {
return 'Please enter a valid Country name';
}
return null;
}),
RichText(
textAlign: TextAlign.center,
text: TextSpan(
text: "By pressing 'Submit', you agree to our \n",
style: TextStyle(
color: Colors.black,
fontFamily: 'raleway',
fontSize: 13.0, letterSpacing: 0.1
),
children: [
TextSpan(
recognizer: TapGestureRecognizer()
..onTap = () {
print('T&C is clicked');
},
text: 'Terms and Conditions',
style: TextStyle(
color: Palette.backgroundColor,
fontFamily: 'raleway',
fontSize: 13.0, letterSpacing: 0.1,
fontWeight: FontWeight.w500
)
)
]
),
),
],
),)
:
Container(
key: _formkey,
margin: EdgeInsets.only(top: 20),
child: Column(
children: [
buidTextField(Icons.email, 'Email', 'info#example.com', false, true, emailController, (signinEmail){
if (signinEmail.isEmpty) {
return 'Username is required';
} else if (signinEmail.length <6) {
return 'Username is short';
}
return null;
}),
buidTextField(Icons.lock, 'Password', '********', true, false, passwordController, (signinPword){
if (signinPword.isEmpty) {
return 'Password is required';
} else if (signinPword.length <8) {
return 'Password should be at least 8 characters';
}
return null;
}),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(children: [
Checkbox(
value: isRememberMe,
activeColor: Colors.black,
onChanged: (value) {
setState(() {
isRememberMe = !isRememberMe;
});
}
),
Text(
"Remember Me",
style: TextStyle(
fontFamily: 'raleway',
fontSize: 15.0,
),
)
],),
TextButton(
onPressed: () {
print('Forgot Password clicked');
},
child: Text(
'Forgot Password?',
style: TextStyle(
fontFamily: 'raleway',
fontSize: 15.0,
color: Palette.backgroundColor
)
)
)
],
)
],
)
)
],
),
),
)),
AnimatedPositioned(
duration: Duration(milliseconds: 700),
curve: Curves.easeIn,
top: isSignUpScreen? 500 : 480,
right: 0,
left:0,
child: Center(
child: Container(
padding: EdgeInsets.all(15),
height: 90,
width: 90,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(50),
),
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.yellow, Palette.backgroundColor]),
borderRadius: BorderRadius.circular(30),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(.3),
spreadRadius: 1,
blurRadius: 2,
offset: Offset(0, 1)
),
]
),
child: IconButton(
onPressed: () {
setState(() {
if (_formkey.currentState.validate()) {
Navigator.push(context, MaterialPageRoute(builder: (context) => Home()));
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error'))
);
}
});
},
icon: Icon(Icons.arrow_forward, color: Colors.white,)
),
),
),
)
),
Positioned(
top: MediaQuery.of(context).size.height-100,
right: 0,
left: 0,
child: Column(
children: [
Text(
"Or Signup with",
style: TextStyle(
fontFamily: 'raleway',
fontSize:15.0,
color: Colors.white,
fontWeight: FontWeight.w600
),
),
SizedBox(height: 10,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
buildTextButton(CommunityMaterialIcons.facebook, 'Facebook', Palette.fbColor),
buildTextButton(CommunityMaterialIcons.google, 'Google', Palette.googleColor),
],
)
],
)
)
],
),
),
);
}
TextButton buildTextButton(IconData icon, String title, Color backgroundColor,) {
return TextButton(
onPressed: () {},
style: TextButton.styleFrom(
backgroundColor: backgroundColor,
primary: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
side:BorderSide(
width: 1.5,
color: Colors.white
),
minimumSize: Size(140, 40)
),
child: Row(
children: [
Icon(
icon,
color: Colors.white,
size: 22,
),
SizedBox(width: 10,),
Text(
title,
style: TextStyle(
color: Colors.white,
fontFamily: 'baloo da 2',
fontSize: 18
),
)
],
)
);
}
Widget buidTextField(
IconData icon, String labelText, String hintText, bool isPassword, bool isEmail, TextEditingController controller, Function validator) {
return Form(
child: Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Column(
children:[
TextFormField(
validator: validator,
controller: controller,
obscureText: isPassword,
keyboardType: isEmail? TextInputType.emailAddress : TextInputType.text,
decoration: InputDecoration(
prefixIcon: Icon(
icon,
color: Colors.black,
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
borderSide: BorderSide(color: Colors.black)),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
borderSide: BorderSide(color: Colors.black)),
labelText: labelText,
labelStyle: TextStyle(fontFamily: 'raleway'),
hintText: hintText,
hintStyle: TextStyle(
fontSize: 14.0,
fontFamily: 'raleway',
),
contentPadding: EdgeInsets.all(10)),
),
]
),
),);
}
}
initialize your form key like this
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();