【问题标题】:Flutter Navigator.popUntil() with ModalRoute.withName() not working in profile and release mode带有 ModalRoute.withName() 的 Flutter Navigator.popUntil() 在配置文件和发布模式下不起作用
【发布时间】:2020-11-01 11:24:45
【问题描述】:

我有一个功能可以导航到带有路线设置的新页面

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),),
        )
      ],
    );
  }
}

在调试模式下,点击第三页中的按钮会导航到第一页,但在配置文件和发布模式下,点击按钮不会执行任何操作。 我目前在 stable 频道上运行 flutter 1.17.4

【问题讨论】:

  • 也许 Page().toString() 在调试和发布中没有返回相同的结果。您可以尝试添加另一个字符串作为 routeName 吗?尝试使用一个简单的字符串,看看是否有效。

标签: flutter flutter-navigation release-mode


【解决方案1】:

我已经尝试过您的代码,FirstPage().toString() 在配置文件模式下返回“Widget”,而在调试中返回“FirstPage”。

我会添加一个包含你可以使用的 routeName 字符串的 mixin。

还请记住,至少对于网络,建议您的初始路由使用“/”。


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

【讨论】:

  • 我尝试了 mixin。仍然没有工作。你说得对,把名字改成 Widget 是对的。由于某种原因,我无法使用配置文件模式运行开发工具。
  • 混入成功了。我在实施时犯了一个错误。谢谢你。我尝试使用 runtimeType 并且它也有效,所以名称:newPage.routeName 变成了名称:newPage.runtimeType
  • 很高兴你成功了。请注意,flutter 建议为您的路线使用类似路径的命名
  • "移动应用程序通常管理大量路线,通常最容易通过名称引用它们。按照惯例,路线名称使用类似路径的结构(例如,'/a/b /c'). 应用的首页路由默认命名为'/'。"api.flutter.dev/flutter/widgets/Navigator-class.html
【解决方案2】:

第一个答案有效,但为了避免向我可用的所有页面添加 mixins,我使用了runtimeType,所以

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

成为

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

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2022-08-08
    • 2021-04-28
    • 2021-10-17
    • 2021-04-08
    • 2022-11-22
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多