In Flutter, navigating to a new screen is an essential feature that allows users to interact with different parts of your app. In this post, we’ll explore the various ways you can navigate to a new screen in Flutter.
The Basic Method: Using Navigator and MaterialPageRoute
The most basic method of navigating to a new screen involves using the `Navigator` widget along with the `MaterialPageRoute`. The following code snippet demonstrates this:
void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: HomeScreen(), ); } } class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Home Screen')), body: Center( child: ElevatedButton( child: const Text( 'Navigate to a new screen >>', style: TextStyle(fontSize: 24.0), ), onPressed: () { _navigateToNextScreen(context); }, ), ), ); } void _navigateToNextScreen(BuildContext context) { Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewScreen())); } } class NewScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('New Screen')), body: const Center( child: Text( 'This is a new screen', style: TextStyle(fontSize: 24.0), ), ), ); } }
This code snippet creates an app with two screens: `HomeScreen` and `NewScreen`. When the user presses the button on `HomeScreen`, it navigates to `NewScreen` using the `_navigateToNextScreen` function.
Loading new screens with Flutter’s pre-canned animations
Flutter provides various transition classes that can be used to load new screens with animations. For example, you can use the `OpenContainer` widget to transform one screen into another.
@override Widget build(BuildContext context) { return Card( color: Colors.white, elevation: 2.0, child: OpenContainer( transitionType: ContainerTransitionType.fadeThrough, closedColor: Theme.of(context).cardColor, closedElevation: 0.0, openElevation: 4.0, transitionDuration: Duration(milliseconds: 1500), openBuilder: (BuildContext context, VoidCallback _) => THENEXTSCREEN(), closedBuilder: (BuildContext _, VoidCallback openContainer) { return ListTile( leading: Icon(Icons.album), title: Text("ITEM NAME"), ); }, ), ); }
This code snippet uses the `OpenContainer` widget to transform a card into another screen when pressed.
Shared Axis Transition
The shared axis transition is similar to that in Tab or Stepper. You can use the `PageTransitionSwitcher` along with a state to model transition between active and previous page.
@override Widget build(BuildContext context) { return Consumer( builder: (context, state, child) { return PageTransitionSwitcher( duration: const Duration(milliseconds: 1500), reverse: !state.isFirstPage, transitionBuilder: ( Widget child, Animation animation, Animation secondaryAnimation, ) { return SharedAxisTransition( child: child, animation: animation, secondaryAnimation: secondaryAnimation, transitionType: SharedAxisTransitionType.horizontal, ); }, child: state.isFirstPage? FIRSTPAGE() : SECONDPAGE(), ); }, ); }
This code snippet uses the `SharedAxisTransition` to switch between two pages.