Возврат на главный экран (routing)

Есть приложение с таким вот роутингом:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MATH',
      initialRoute: '/',
      routes: {
        // When navigating to the "/" route, build the FirstScreen widget.
        '/': (context) => MyCustomForm(),
        // When navigating to the "/second" route, build the SecondScreen widget.
        '/1': (context) => FirstRoute(),
        '/2': (context) => SecondRoute(),
        '/3': (context) => ThirdRoute(),
        '/final': (context) => FinalScreen(),
      },

    );
  }
}

переключение происходит таким образом

onPressed: ()
{
Navigator.pushNamed(context, "/" + page_id));
}

Как сделать чтобы с любой страницы при свайпе влево (назад) или с AppBar (стрелка назад) возврат был всегда на главную страницу( "/" )? Сейчас возврат идет на предыдущую так как они друг за другом открываются(/, 1, 2, 3, final)

Спасибо!


Ответы (1 шт):

Автор решения: MiT
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MATH',
      initialRoute: '/',
      routes: {
        '/': (context) => MyCustomForm(),
        '/1': (context) => FirstRoute(),
        '/2': (context) => SecondRoute(),
      },
    );
  }
}

class MyCustomForm extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.pushNamedAndRemoveUntil(
            context, "/", (Route<dynamic> route) => false);
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text("MyCustomForm"),
        ),
        body: Center(
          child: RaisedButton(
            onPressed: () => Navigator.pushNamed(context, "/" + 1.toString()),
            child: Text('Go next!'),
          ),
        ),
      ),
    );
  }
}

class FirstRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.pushNamedAndRemoveUntil(
            context, "/", (Route<dynamic> route) => false);
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text("FirstRoute"),
        ),
        body: Center(
          child: RaisedButton(
            onPressed: () => Navigator.pushNamed(context, "/" + 2.toString()),
            child: Text('Go next 2!'),
          ),
        ),
      ),
    );
  }
}

class SecondRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.pushNamedAndRemoveUntil(
            context, "/", (Route<dynamic> route) => false);
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text("SecondRoute"),
        ),
        body: Center(
          child: RaisedButton(
            onPressed: () => Navigator.pushNamedAndRemoveUntil(
                context, "/", (Route<dynamic> route) => false),
            child: Text('Go back!'),
          ),
        ),
      ),
    );
  }
}
→ Ссылка