Loading...
Loading...
Move between or deep link to different screens or routes within a Flutter application
npx skill4agent add flutter/skills flutter-routing-and-navigationNavigatorRouterRoutergo_routerNavigatorNavigatorNavigator.pushNavigator.popMaterialPageRouteCupertinoPageRouteMaterialApp.routesonGenerateRouteNavigator.pushRoutergo_routerNavigatorRouteNavigator.of(context).push(
MaterialPageRoute<void>(
builder: (context) => const SecondScreen(),
),
);Navigator.of(context).pop();RouteSettings// Navigating and passing data
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (context) => DetailScreen(todo: currentTodo),
),
);
// Receiving data
class DetailScreen extends StatelessWidget {
const DetailScreen({super.key, required this.todo});
final Todo todo;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(todo.title)),
body: Text(todo.description),
);
}
}// Navigating and passing data
Navigator.pushNamed(
context,
'/details',
arguments: currentTodo,
);
// Extracting data in the destination widget
final todo = ModalRoute.of(context)!.settings.arguments as Todo;MaterialAppinitialRouteroutesonGenerateRouteMaterialApp(
title: 'Named Routes App',
initialRoute: '/',
routes: {
'/': (context) => const FirstScreen(),
'/second': (context) => const SecondScreen(),
},
// OR use onGenerateRoute for dynamic argument extraction
onGenerateRoute: (settings) {
if (settings.name == '/details') {
final args = settings.arguments as Todo;
return MaterialPageRoute(
builder: (context) => DetailScreen(todo: args),
);
}
assert(false, 'Need to implement ${settings.name}');
return null;
},
)NavigatorGlobalKey<NavigatorState>class SetupFlowState extends State<SetupFlow> {
final _navigatorKey = GlobalKey<NavigatorState>();
void _onDiscoveryComplete() {
_navigatorKey.currentState!.pushNamed('/select_device');
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Setup Flow')),
body: Navigator(
key: _navigatorKey,
initialRoute: '/find_devices',
onGenerateRoute: _onGenerateRoute,
),
);
}
Route<Widget> _onGenerateRoute(RouteSettings settings) {
Widget page;
switch (settings.name) {
case '/find_devices':
page = WaitingPage(onWaitComplete: _onDiscoveryComplete);
break;
case '/select_device':
page = const SelectDevicePage();
break;
default:
throw StateError('Unexpected route name: ${settings.name}!');
}
return MaterialPageRoute(builder: (context) => page, settings: settings);
}
}Navigator.pop()Navigator.canPop(context)initialRoutehomeMaterialAppModalRouteMaterialApp.routesRouterhomeMaterialAppinitialRouteGlobalKey<NavigatorState>NavigatorModalRoute.of(context)!.settings.arguments