The popup window is very useful in most of the times, you can display a separate content in a popup window, like a login screen. In flutter. The popup window should be a Modal window, so we can use [su_label type=”success”]ModalRoute[/su_label] for easy to create it.
Please find the below step for creating a popup window:
1. Create a popup class and inherit to ModalRoute (popup.dart)
class PopupLayout extends ModalRoute {
//ToDo...
}We need to override some properties
@override
Duration get transitionDuration => Duration(milliseconds: 300);
@override
bool get opaque => false;
@override
bool get barrierDismissible => false;
@override
Color get barrierColor =>
bgColor == null ? Colors.black.withOpacity(0.5) : bgColor;
@override
String get barrierLabel => null;
@override
bool get maintainState => false;define some variables for dynamic update the margin and content
double top; double bottom; double left; double right; Color bgColor; final Widget child;
and pass them to the constructor
PopupLayout(
{Key key,
this.bgColor,
@required this.child,
this.top,
this.bottom,
this.left,
this.right});override the [su_label type=”success”]buildPage[/su_label] for create the popup content
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
if (top == null) this.top = 10;
if (bottom == null) this.bottom = 20;
if (left == null) this.left = 20;
if (right == null) this.right = 20;
return GestureDetector(
onTap: () {
// call this method here to hide soft keyboard
SystemChannels.textInput.invokeMethod('TextInput.hide');
},
child: Material( // This makes sure that text and other content follows the material style
type: MaterialType.transparency,
//type: MaterialType.canvas,
// make sure that the overlay content is not cut off
child: SafeArea(
bottom: true,
child: _buildOverlayContent(context),
),
),
);
}
//the dynamic content pass by parameter
Widget _buildOverlayContent(BuildContext context) {
return Container(
margin: EdgeInsets.only(
bottom: this.bottom,
left: this.left,
right: this.right,
top: this.top),
child: child,
);
}override the [su_label type=”success”]buildTransitions[/su_label] for handle the animation
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
// You can add your own animations for the overlay content
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation,
child: child,
),
);
}2. Create a popup content class (popup_content.dart)
Because we need to handle the status in the content, so we also need a dynamic content class for handle the popup content, and this class will inherit to [su_label type=”warning”]StatefulWidget[/su_label]
class PopupContent extends StatefulWidget {
final Widget content;
PopupContent({
Key key,
this.content,
}) : super(key: key);
_PopupContentState createState() => _PopupContentState();
}pass the dynamic content widget
class _PopupContentState extends State<PopupContent> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
child: widget.content,
);
}3. Create a common method to call the popup layout
We can create a common method [su_label type=”info”]showPopup[/su_label] for call the popup layout
showPopup(BuildContext context, Widget widget, String title,
{BuildContext popupContext}) {
Navigator.push(
context,
PopupLayout(
top: 30,
left: 30,
right: 30,
bottom: 50,
child: PopupContent(
content: Scaffold(
appBar: AppBar(
title: Text(title),
leading: new Builder(builder: (context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
try {
Navigator.pop(context); //close the popup
} catch (e) {}
},
);
}),
brightness: Brightness.light,
),
resizeToAvoidBottomPadding: false,
body: widget,
),
),
),
);
}for the dynamic content widget, we can use any widgets as below:
Widget _popupBody() {
return Container(
child: Text('This is a popup window'),
);
}And please find the below sample screen capture for the result:

You can find the below full source code for the demo. Because the iOS folder is larger, so I didn’t include it in the source code
coderblog_popup_window.zip (8194 downloads ) ![]()






