flutter


Replace initial Route in MaterialApp without animation?


Our app is built on top of Scaffold and to this point we have been able to accommodate most of our routing and navigation requirements using the provided calls within NavigatorState (pushNamed(), pushReplacementNamed(), etc.). What we don't want though, is to have any kind of 'push' animation when a user selects an item from our drawer (nav) menu. We want the destination screen from a nav menu click to effectively become the new initial route of the stack. For the moment we are using pushReplacementNamed() for this to ensure no back arrow in the app bar. But, the slide-in-from-the-right animation implies a stack is building.
What is our best option for changing that initial route without animation, and, can we do that while also concurrently animating the drawer closed? Or are we looking at a situation here where we need to move away from Navigator over to just using a single Scaffold and updating the 'body' directly when the user wants to change screens?
We note there is a replace() call on NavigatorState which we assume might be the right place to start looking, but it's unclear how to access our various routes originally set up in new MaterialApp(). Something like replaceNamed() might be in order ;-)
Thanks in advance!
What you're doing sounds somewhat like a BottomNavigationBar, so you might want to consider one of those instead of a Drawer.
However, having a single Scaffold and updating the body when the user taps a drawer item is a totally reasonable approach. You might consider a FadeTransition to change from one body to another.
Or, if you like using Navigator but don't want the default slide animation, you can customize (or disable) the animation by extending MaterialPageRoute. Here's an example of that:
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyCustomRoute<T> extends MaterialPageRoute<T> {
MyCustomRoute({ WidgetBuilder builder, RouteSettings settings })
: super(builder: builder, settings: settings);
#override
Widget buildTransitions(BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
if (settings.isInitialRoute)
return child;
// Fades between routes. (If you don't want any animation,
// just return child.)
return new FadeTransition(opacity: animation, child: child);
}
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Navigation example',
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {
case '/': return new MyCustomRoute(
builder: (_) => new MyHomePage(),
settings: settings,
);
case '/somewhere': return new MyCustomRoute(
builder: (_) => new Somewhere(),
settings: settings,
);
}
assert(false);
}
);
}
}
class MyHomePage extends StatelessWidget {
#override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Navigation example'),
),
drawer: new Drawer(
child: new ListView(
children: <Widget> [
new DrawerHeader(
child: new Container(
child: const Text('This is a header'),
),
),
new ListTile(
leading: const Icon(Icons.navigate_next),
title: const Text('Navigate somewhere'),
onTap: () {
Navigator.pushNamed(context, '/somewhere');
},
),
],
),
),
body: new Center(
child: new Text(
'This is a home page.',
),
),
);
}
}
class Somewhere extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Text(
'Congrats, you did it.',
),
),
appBar: new AppBar(
title: new Text('Somewhere'),
),
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new DrawerHeader(
child: new Container(
child: const Text('This is a header'),
),
),
],
),
),
);
}
}

Related Links

Flutter: Move dialog up to make room for soft keyboard?
How to create a hyperlink in Flutter widget?
Adding a splash screen to Flutter apps
How to change the application icon on Flutter?
How can I target status bar color or opacity in a Flutter app?
How do I supply an initial value to a text field?
How to control sizing behaviour to be based on parent or child?
Programmatically scrolling to the end of a ListView
Get Tap Position Relative to Widget
How to get the smallest child in a box?
Replace initial Route in MaterialApp without animation?
How to make 1/3 of an image take up the full screen
How to make an Input's hintText disappear when the user starts typing?
PageStorage in Flutter - how does it work?
How to select Development team for iOS app created in Flutter
Sizing elements to percentage of screen width/height

Categories

HOME
mocking
office-js
copy
robotframework
weblogic11g
wso2is
mvvm-light
build.gradle
classloader
activerecord
base
bluej
google-cloud-sdk
postgresql-9.5
group-by
cloudrail
embed
zap
git-bash
csom
point-cloud-library
phonegap-desktop-app
parallax.js
silverlight-5.0
plm
codeceptjs
stl
pmd
magento2.0.2
evercookie
swipe
haxm
knowledge-management
azure-management-api
edeliver
sweet.js
mediawiki-api
gretl
appdynamics
spring-form
wrk
laravel-routing
canopen
unityscript
javascript-security
asp.net-mvc-custom-filter
itamae
atmosphere.js
hard-drive-failure
topojson
evaluate
webdeploy-3.5
python-3.1
pddl
strace
aldryn
monkeyrunner
selectsinglenode
telescope
linegraph
size-t
odoo
targetinvocationexception
adserver
imake
office-2010
iqueryable
nhunspell
appstore-sandbox
shift
hresult
wpf-4.0
eject
timestamp-with-timezone
graphiti-js
ondraw
livevalidation
android-assets
f2c
rails-3.1
mkmapviewdelegate
xoom
executescalar
68hc11
large-teams
metaphone

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App