Flutter Navigator.popUntil () с ModalRoute.withName () не работает в режиме профиля и выпуска - PullRequest
1 голос
/ 12 июля 2020

У меня есть функция, которая переходит на новую страницу с настройками маршрута

void pushWithSettings(
    {@required BuildContext context, @required Widget newPage}) {
  Navigator.push(
      context,
      MaterialPageRoute(
          settings: RouteSettings(
            name: newPage.toString(),
          ),
          builder: (_) => newPage));
}

, и я выхожу на определенную страницу, используя

Navigator.popUntil(context, ModalRoute.withName(Page().toString));

Это хорошо работает в режиме отладки, но в профиля и режима выпуска он появляется только один раз

Пример для контекста

import 'package:flutter/material.dart';
import 'package:flutter_app/main.dart';

class FirstPage extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Center(child: Text("First Page"),),
        RaisedButton(
          onPressed: (){
            pushWithSettings(context: context, newPage: SecondPage());
          },
          child: Text("Navigate to second", style: TextStyle(inherit: false)),
        )
      ],
    );
  }
}

class SecondPage extends StatelessWidget {
  
@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      Center(child: Text("Second Page"),),
      RaisedButton(
        onPressed: (){
          pushWithSettings(context: context, newPage: ThirdPage());
        },
        child: Text("Navigate to third", style: TextStyle(inherit: false)),
      )
    ],
  );
}
}

class ThirdPage extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Center(child: Text("Third Page"),),
        RaisedButton(
          onPressed: (){
            Navigator.popUntil(context, ModalRoute.withName(FirstPage().toString()));
          },
          child: Text("Navigate to first", style: TextStyle(inherit: false),),
        )
      ],
    );
  }
}

В режиме отладки нажатие кнопки на третьей странице приводит к переходу на первую страницу, но в режиме профиля и выпуска нажатие кнопка ничего не делает. Я сейчас использую flutter 1.17.4 на стабильном канале

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Я пробовал ваш код, и FirstPage().toString() в режиме профиля возвращает 'Widget', а при отладке возвращает 'FirstPage'.

Я бы добавил миксин, содержащий строку routeName, которую вы можете использовать. *

Также помните, что по крайней мере для Интернета рекомендуется, чтобы ваш начальный маршрут был с '/'.


void pushWithSettings(
    {@required BuildContext context, @required NamedRoute newPage}) {
  Navigator.push(
      context,
      MaterialPageRoute(
          settings: RouteSettings(
            name: newPage.routeName,
          ),
          builder: (_) => newPage));
}

mixin NamedRoute implements Widget {
  String get routeName;
}


class ThirdPage extends StatelessWidget with NamedRoute {
  @override
  String get routeName => '/third_page';

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Center(
          child: Text("Third Page"),
        ),
        RaisedButton(
          onPressed: () {
            Navigator.popUntil(context, ModalRoute.withName(FirstPage().routeName));
          },
          child: Text(
            "Navigate to first",
            style: TextStyle(inherit: false),
          ),
        )
      ],
    );
  }
}

Проверьте кодовое слово https://codepen.io/jamesblasco/pen/QWyBQOm

0 голосов
/ 14 июля 2020

Первый ответ работает, но, чтобы не добавлять миксины на все доступные мне страницы, я использовал runtimeType, поэтому

settings: RouteSettings(
            name: newPage.toString(),
          ),

превратилось в

settings: RouteSettings(
            name: newPage.runtimeType.toString(),
          ),
...