Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Navigation.pop()和Navigation.push()的行为异常_Flutter_Dart_Flutter Navigation - Fatal编程技术网

Flutter Navigation.pop()和Navigation.push()的行为异常

Flutter Navigation.pop()和Navigation.push()的行为异常,flutter,dart,flutter-navigation,Flutter,Dart,Flutter Navigation,我正在使用Flatter在应用程序中创建一个注册部分,并尝试执行以下操作: 用户单击“注册” 用户在注册过程中的任何阶段都可以按下后退按钮 然后弹出一个警告对话框,询问用户是否真的想离开注册过程 用户按Yes 然后,用户将返回应用程序的第一个(主页) 这适用于我单击“注册”后的第一页,但当我进入第二页时,步骤4使我保持在同一页上,然后当我再次尝试时,它就起作用了。但事实不应该如此 经过一些调试,我发现了问题,但我不知道为什么会发生 我在第二个代码片段中,在onBackPressed()

我正在使用Flatter在应用程序中创建一个注册部分,并尝试执行以下操作:

  • 用户单击“注册”

  • 用户在注册过程中的任何阶段都可以按下后退按钮

  • 然后弹出一个警告对话框,询问用户是否真的想离开注册过程

  • 用户按Yes

  • 然后,用户将返回应用程序的第一个(主页)

  • 这适用于我单击“注册”后的第一页,但当我进入第二页时,步骤4使我保持在同一页上,然后当我再次尝试时,它就起作用了。但事实不应该如此

    经过一些调试,我发现了问题,但我不知道为什么会发生

    我在第二个代码片段中,在
    onBackPressed()
    函数的末尾,以注释的形式写下了这个问题,这样就可以清楚地知道它在哪里被破坏了:)

    以下是我从mymain.dart导航到注册过程页面的代码:

    Navigator.push(
    上下文
    MaterialPage路由(生成器:(上下文)=>SignUp())
    )
    
    然后,在注册过程中,每当我进入下一页时,我都会执行一个
    Navigation.pop(context)
    pop堆栈中的当前注册页,然后执行一个
    Navigation.push()
    ,以打开下一页

    以下是每个注册页面中后退按钮功能的代码:

    bool backIsPressed=false;
    工具_Tools=新工具();
    @凌驾
    void initState(){
    super.initState();
    BackButtonInterceptor.add(on Backpressed);
    }
    @凌驾
    无效处置(){
    BackButtonInterceptor.remove(按Backpressed);
    super.dispose();
    }
    bool onBackPressed(bool stop defaultbuttonevent){
    this.backIsPressed=!backIsPressed;
    如果(反压){
    _工具。yesNoAlert(
    上下文
    “回去吗?”,
    “确实要返回吗?所做的更改将不会保存。”,
    () {
    this.backIsPressed=false;
    pop(上下文,true);
    },
    () {
    this.backIsPressed=false;
    pop(上下文,false);
    },
    ).然后((res){
    //-------在这里休息-----------------
    //第一次按“是”时,“res”返回null
    //但是根据Flatter的文档,Navigation.pop(context,true)应该返回true
    如果(res){
    Navigator.pop(上下文);
    }
    });
    }
    否则{
    Navigator.pop(上下文);
    }
    返回true;
    }
    
    最后是
    Tools
    类中的
    yesOrNoAlert()
    函数

    Future yesNoAlert(BuildContext上下文、字符串标题、,
    字符串说明、函数yes函数、函数noFunction){
    这是。_isDialogOpen=true;
    返回显示对话框(
    上下文:上下文,
    禁止:错误,
    生成器:(BuildContext上下文){
    返回警报对话框(
    标题:新文本(标题),
    内容:新文本(说明),
    行动:[
    新扁平按钮(
    子项:新文本(“是”),
    已按下:(){
    _isDialogOpen=false;
    是函数();
    },
    ),
    新扁平按钮(
    子项:新文本(“否”),
    已按下:(){
    _isDialogOpen=false;
    noFunction();
    },
    )
    ],
    );
    });
    }
    

    希望我解释得很好。

    如果你想回到第一页,而不是pop(),你可以在用户选择yes时使用popUntil()。。。无需通过“res”


    在此处了解更多信息:

    从何处调用onBackPressed()?@pablobarera-它在
    initState
    方法中设置为
    backbuttonierceptor