如果用户按下后退按钮,则阻止Navigator.push

时间:2019-10-29 11:58:40

标签: flutter dart flutter-navigation flutter-onpressed

在我的应用中,我需要在调用Navigator.push之前执行代码。但是问题是,如果用户在执行代码之前按下返回按钮,则会出现错误:

  

E / flutter(8415):[错误:flutter / lib / ui / ui_dart_state.cc(148)]   未处理的异常:查找停用的窗口小部件的祖先是   不安全。 E / flutter(8415):这时小部件的状态   元素树不再稳定。 E / flutter(8415):安全参考   到控件的祖先的dispose()方法中,保存对   通过调用窗口小部件的InheritFromFromWidgetOfExactType()来祖先   didChangeDependencies()方法。

问题是代码仍在执行,并且即使用户按下了返回按钮(在Navigator.push中,也正在调用Widget2

这是mwe:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Widget1(),
    );
  }
}

class Widget1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () async {
            await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => Widget2(),
                ));
          },
        ),
      ),
    );
  }
}

class Widget2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(body: RaisedButton(
      onPressed: () async {
//      Press back button before Future complete
        await Future.delayed(Duration(seconds: 5));
        await Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => Widget3(),
            ));
      },
    ));
  }
}

class Widget3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(child: Text('Widget 3'));
  }
}

1 个答案:

答案 0 :(得分:0)

您可以执行几项操作,具体取决于您想要什么:

  • 要用新视图替换当前视图,以防止用户导航回到上一页,请使用Navigator.pushReplacement(...)
  • 要在应用栏中显示后退按钮,但阻止用户后退,请用WillPopScope包裹Scaffold,并设置onWillPop属性返回Future.value(false)
  • 要简单地隐藏后退按钮,请访问:AppBar(...,automaticallyImplyLeading: false,...)。仍然可以通过按Android中的“后退”按钮或按iOS中的滑动手势来返回。