// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; /// Flutter code sample for [RouteObserver]. final RouteObserver> routeObserver = RouteObserver>(); void main() { runApp(const RouteObserverApp()); } class RouteObserverApp extends StatelessWidget { const RouteObserverApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( navigatorObservers: [ routeObserver ], home: const RouteObserverExample(), ); } } class RouteObserverExample extends StatefulWidget { const RouteObserverExample({super.key}); @override State createState() => _RouteObserverExampleState(); } class _RouteObserverExampleState extends State with RouteAware { List log = []; @override void didChangeDependencies() { super.didChangeDependencies(); routeObserver.subscribe(this, ModalRoute.of(context)!); } @override void dispose() { routeObserver.unsubscribe(this); super.dispose(); } @override void didPush() { // Route was pushed onto navigator and is now the topmost route. log.add('didPush'); } @override void didPopNext() { // Covering route was popped off the navigator. log.add('didPopNext'); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( 'RouteObserver log:', style: Theme.of(context).textTheme.headlineSmall, ), ConstrainedBox( constraints: const BoxConstraints(maxHeight: 300.0), child: ListView.builder( itemCount: log.length, itemBuilder: (BuildContext context, int index) { if (log.isEmpty) { return const SizedBox.shrink(); } return Text( log[index], textAlign: TextAlign.center, ); }, ), ), OutlinedButton( onPressed: () { Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) => const NextPage(), ), ); }, child: const Text('Go to next page'), ), ], ), ), ); } } class NextPage extends StatelessWidget { const NextPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: FilledButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text('Go back to RouteAware page'), ) ), ); } }