Navigation and Routing
Basic Navigations
Part 1 - Introduction
Jumail Bin Taliba
School of Computing, UTM
April 2020
Agenda
• Introduction to Navigation and Routes
• Navigating to another screen
• Navigating back to the previous screen
• Passing data between screens
Introduction
Navigation:
• Move between screens
Routes
• Screens or Pages
Navigations in Flutter are handled in
Stack Push
Show screens
Navigations in Flutter are handled in
Stack Pop
Close screens
Last In First Out (LIFO)
Demo App
Peer and Self Assessment
About the app
Evaluator
Group member Point
Assessment
Evaluated
Members
About the app
Member being evaluated
Scale
Value Scale description
4 Excellent
3 Good
Criteria
2 Fair
1 Poor
0 Not at all
About the app
Overall Performance
Example Calculation
Criterion Scale Grade Scale Point
Interaction Excellent 4
Commitment Fair 2
Effort Good 3
Adaptability Fair 2
Personality Excellent 4
Total 15
Percentage (15 / 20) x 100 =
75%
Summary (main) screen Details screen
Code
[Link]
Attendance
SINGLE ANSWER
Program’s file structure
Remaining parts of this lesson
will be available soon ….
Navigation and Routing
Basic Navigations
Part 2 - Demo
Jumail Bin Taliba
School of Computing, UTM
April 2020
Getting started with part 2
Program’s file structure
Task 1
Create the screen skeletons
AppBar > title
ListTile > title
ListTile
CircleAvatar
and subtitle
[Link]
DropdownButton
Task 2
Define model classes and mock data
class class class
class
GroupMember Assessment Criterion Scale
list list
mockData criteria
Task 3
Build the screens with dynamic content
mockData
(mock_data.dart)
criteria
scales
([Link])
Task 4
Navigate and pass data to the second screen
Task 5
Return from the second screen with result
Task 6
Figure out the problem with the “Cancel” operation
mockData
(mock_data.dart)
passing object
(i.e. by reference)
Task 6
Solution to the “Cancel” operation problem
original the copy of
assessment the object
object Pass a COPY
Return null
Return the
edited object
Task 7
Disable AppBar’s and phone’s back buttons
Summary
• Define model classes
• Navigate to another screens
• Passing data from a screen to another
• Return result to the previous screen
• Asynchronous programming
• Passing a copy of object
• Disable default back buttons
Navigation and Routing
Named Routes
Jumail Bin Taliba
School of Computing, UTM
April 2020
Why named routes?
• Reference a screen with name
• Create aliases
e.g. the home screen can be referenced with different names
/, /home, /main
• Define explicit names
e.g. constructing different screens from the same class
• /adminProfile refers to widget ProfileScreen('admin’)
• /userProfile refers to widget ProfileScreen('guest’)
• Centralize the routing code
How to implement named routes?
MaterialApp() provides two ways:
• onGenerateRoute recommended
• routes
The demo will focus only on the “onGenerateRoute” approach
To learn about the “routes” approach, see the sample code (in the
using_routes branch)
git checkout using_routes
Demo App
Continue from the
previous app
Task 1
Prepare the base code
Clone the source code
git clone [Link]
Start from the base code
git checkout <the_base_commit>
git branch playground
Task 2
Define and handle the named routes
"/summary" "/details"
Define and handle routes in MaterialApp()with
the onGenerateRoute parameter
Task 3
Navigate and pass data to the second screen
original the copy of
assessment the object
object Pass a COPY
To navigate: [Link]() To receive the data:
In route handler, read from
To pass data: arguments
[Link]
Then pass to next screen via
Constructor
How to pass multiple data
Wrap the data in an object
.pushNamed(..., arguments: Arithmetic(op: '+’,
numbers: [1, 2]));
Use collections such as map or list
.pushNamed(..., arguments: ['+', 10, 5] );
.pushNamed(..., arguments: {'op': '+’, recommended
'num1': 10,
'num2': 5} );
Task 4
Return from the second screen with result
the copy of
the object
Return null
Return the edited object
To return: [Link]()
To pass result: via parameter
Task 5
Refactor routing code into separate files
After
Before
[Link]
[Link] [Link]
Define and handle
void main()=>runApp( route names
Routes
MaterialApp(
onGenerateRoute:
Define and handle
Routes
[Link] [Link]
[Link] void main()=>runApp(
) MaterialApp(
onGenerateRoute: ….
);
)
);
Program’s file structure
Task 6
Reorganize the UI built, make only selected child widget stateful rather
than the whole screen
DropdownButton
ListTile will be stateful
will be stateful
Summary
• Why use named routes
• Implementation: routes and onGenerateRoute
• Navigate and pass data to another screen
• Back to main screen and pass results
• Refactor routes
Navigation and Routing
More Push and Pop
Operations
Jumail Bin Taliba
School of Computing, UTM
April 2020
Agenda
• More pop operations:
• maybePop()
• canPop()
• popUntil()
• More push operations:
• pushNamed()
• pushReplacementNamed(),
• popAndPush()
• pushNamedAndRemoveUntil()
• How they work and some use cases
• Passing data and return results between routes
Download the source code
git clone [Link]
There are two branches (besides master):
git branch –a (to check branch list)
git checkout more_pop (Example 1)
git checkout more_push (Example 2)
About the codebase
• Only one file, [Link]
• Only one Screen widget class
• Multiple routes from the same class
maybePop()
• It’s like pop()but doesn’t work on the last screen.
• Example use case: to prevent user from closing the app accidently
In Screen 3, invoking
[Link](context)
In Screen 2, invoking
pops the screen from the stack
[Link](context)
pops the screen from the stack
In Screen 1, invoking
[Link](context)
has no effect
canPop()
Returns true if a screen can be popped off from the stack
Example use case: to override phone back button
Example:
• Invoking this method in Screen 3 and 2 returns true
• Invoking this method in Screen 1 returns false
popUntil()
• pop off all screens from the current one till reaching the specified screen.
• Must explicitly name the route with settings parameter
• Example use case: in a shopping app, to return to the home screen after
completing payment process
In Screen 3, invoking
popUntil( /screen1 )
pops Screen 3 and Screen 2
More pop operations
S T A C K
/screen3
/screen2
/screen1
pushReplacementNamed()
popAndPushNamed()
• Replace the current screen with a specified
one
• To prevent going back to the previous screen
• The difference between these two methods:
screen transition animation
S T A C K
/screen3
/screen2
/replacement
/screen1
pushReplacementNamed()
popAndPushNamed()
Example use cases:
• Show Main screen after a splash screen
1. sdfasd
•
• Open User screen after logging in
S T A C K
User Screen
pushNamedAndRemoveUntil()
• Pops all screen till reaching the specified
screen and push a new screen
S T A C K
/screen3
/replacement
/screen2
/screen1
pushNamedAndRemoveUntil()
Example use cases:
• Logout after going through a series of screens:
1. sdfasd
•
e.g. Logging out after submitting an assignment on elearning,
bring the user to Elearning Home Screen
in Logout
Logout
S T A C K
Submit Screen
[Link] (
context, Assignment 1
‘/elearningHome’,
Assessement List
[Link](‘/studentHome’)
) Course Screen
Student Home
Passing data and results between routes (1)
• A route may pass data to the next
route via the arguments parameter
/replacement
• A route may return results to its
creator via the result parameter (or arguments
the second parameter in case of pop() /screen3 result
method)
S T A C K
in Screen 3
/screen2
[Link]
(context,’/replacement’,
arguments: …., result: …. )
/screen1
Passing data and results between routes (2)
• The arguments is sent to onGenerateRoute callback function
• Then, passed to the route via the screen constructor
/replacement
arguments
/screen3
S T A C K
/screen2
/screen1
Passing data and results between routes (3)
• The creator route receives the result
from the function return
/screen3 result
S T A C K
in Screen 2
theResult = await [Link] /screen2
(context,’/screen3’, arguments: …. )
/screen1