Reputation: 3909
I have form inside AlertDialog.I have problem about Keyboard hide my AlertDialog.
I'm already follow another question include This and This issue Form Github, But it's not solved my problem.
I also try using wrap my AlertDialog with SingleChildScrollView
,But Position AlertDialog on Top Screen.
I'm doing wrong ?
import 'package:flutter/material.dart';
class TestingPage extends StatelessWidget {
static const routeNamed = "/testing-page";
@override
Widget build(BuildContext context) {
return Center(
child: RaisedButton(
onPressed: () => showDialog(
child: CustomAlertDialog(
// controller: _txtUserController,
title: "Description About You",
labelText: "Fill Your Name",
errorTextEmpty: "Provided Name",
// boxName: "user_box",
// userModelHive: UserModelHive()
// ..id = DateTime.now()
// ..giverName = _txtUserController.text
// ..pinCodeNumber = "",
// routeName: HomeScreen.routeNamed,
),
context: context,
barrierDismissible: false,
),
child: Text('Open Dialog'),
),
);
}
}
class CustomAlertDialog extends StatefulWidget {
final TextEditingController controller;
final String title;
final String labelText;
final String errorTextEmpty;
final String boxName;
// final UserModelHive userModelHive;
final String routeName;
CustomAlertDialog({
this.controller,
this.title,
this.labelText,
this.errorTextEmpty,
this.boxName,
// this.userModelHive,
this.routeName,
});
@override
_CustomAlertDialogState createState() => _CustomAlertDialogState();
}
class _CustomAlertDialogState extends State<CustomAlertDialog> {
// final Repository _repository = Repository();
final formKeys = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
key: formKeys,
child: _SystemPadding(
child: AlertDialog(
title: Text(widget.title),
content: TextFormField(
controller: widget.controller,
decoration: InputDecoration(
labelText: widget.labelText,
border:
OutlineInputBorder(borderRadius: BorderRadius.circular(30)),
),
validator: (value) {
if (value.isEmpty) {
return widget.errorTextEmpty;
}
return null;
},
),
actions: <Widget>[
FlatButton.icon(
icon: Icon(Icons.verified_user),
label: const Text("Let's go"),
color: Theme.of(context).primaryColor,
textTheme: ButtonTextTheme.primary,
onPressed: () {})
],
),
),
);
}
}
class _SystemPadding extends StatelessWidget {
final Widget child;
_SystemPadding({this.child});
@override
Widget build(BuildContext context) {
var mediaQuery = MediaQuery.of(context);
print(mediaQuery.viewInsets.bottom);
return AnimatedContainer(
padding: mediaQuery.padding,
color: Colors.black.withOpacity(.5),
duration: const Duration(milliseconds: 300),
child: child,
);
}
}
Upvotes: 2
Views: 2700
Reputation: 2320
Please just wrap your alert dialog with SingleChildScrollView
example
showDialog(
context: context,
builder: (BuildContext context) {
return SingleChildScrollView(child: alert);
},
);
Upvotes: 1
Reputation: 11679
Inside _SystemPadding
class, while returning AnimatedContainer
, use padding
as mediaQuery.padding
that'll adjust the height of the alertDialog
and no need to wrap alertDialog
content with SingleChildScrollView
. Working code below:
class _SystemPadding extends StatelessWidget {
final Widget child;
_SystemPadding({this.child});
@override
Widget build(BuildContext context) {
var mediaQuery = MediaQuery.of(context);
return new AnimatedContainer(
padding: mediaQuery.padding,
duration: const Duration(milliseconds: 300),
child: child);
}
}
void _showDialog(BuildContext context) {
showDialog(
context: context,
child: _SystemPadding(
child: CustomAlertDialog(
// controller: _txtUserController,
title: "Description About You",
labelText: "Fill Your Name",
errorTextEmpty: "Provided Name",
context: context,
barrierDismissible: false,
),
)
);
}
Output: It scrolls up the dialog appropriately when keyboard opens:
This way the alertDialog doesn't move at the top, but adjusts itself to be considerably above the keyboard.
Hope this answers your question.
Upvotes: 0