Navigate to a new screen and back
Most apps contain several screens for displaying different types of information. For example, we might have a screen that shows products. Our users could then tap on a product to get more information about it on a new screen.
In Android terms, our screens would be new Activities. In iOS terms, new ViewControllers. In Flutter, screens are just Widgets!
So how do we navigate to new screens? Using the Navigator!
Directions
- Create two screens
- Navigate to the second screen using
Navigator.push - Return to the first screen using
Navigator.pop
1. Create two screens
First, we’ll need two screens to work with. Since this is a basic example, we’ll create two screens, each containing a single button. Tapping the button on the first screen will navigate to the second screen. Tapping the button on the second screen will return our user back to the first!
First, we’ll set up the visual structure.
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('First Screen'),
),
body: new Center(
child: new RaisedButton(
child: new Text('Launch new screen'),
onPressed: () {
// Navigate to second screen when tapped!
},
),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Second Screen"),
),
body: new Center(
child: new RaisedButton(
onPressed: () {
// Navigate back to first screen when tapped!
},
child: new Text('Go back!'),
),
),
);
}
}
2. Navigate to the second screen using Navigator.push
In order to Navigate to a new screen, we’ll need to use the
Navigator.push
method. The push method will add a Route to the stack of routes managed by
the Navigator!
The push method requires a Route, but where does the Route come from?
We can create our own, or use the MaterialPageRoute
out of the box. The MaterialPageRoute is handy because it transitions to the
new screen using a platform-specific animation.
In the build method of our FirstScreen Widget, we’ll update the onPressed
callback:
// Within the `FirstScreen` Widget
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondScreen()),
);
}
3. Return to the first screen using Navigator.pop
Now that we’re on our second screen, how do we close it out and return to the
first? Using the Navigator.pop
method! The pop method will remove the current Route from the stack of
routes managed by the navigator.
For this part, we’ll need to update the onPressed callback found in our
SecondScreen Widget
// Within the SecondScreen Widget
onPressed: () {
Navigator.pop(context);
}
Complete Example
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: 'Navigation Basics',
home: new FirstScreen(),
));
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('First Screen'),
),
body: new Center(
child: new RaisedButton(
child: new Text('Launch new screen'),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondScreen()),
);
},
),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Second Screen"),
),
body: new Center(
child: new RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: new Text('Go back!'),
),
),
);
}
}
