美文网首页
flutter navigator2.0 返回键监听

flutter navigator2.0 返回键监听

作者: gooddaytoyou | 来源:发表于2021-08-24 17:49 被阅读0次

    navigator 1.0 使用 WillPopScope 可以监听返回事件,但是在navigator 2.0使用WillPopScope时会失效。碰到这个问题,参考 Add back button listener widget 使用BackButtonListener可以完美解决。

    项目介绍

    页面OnePage跳转到TwoPage,在TwoPage监听返回事件。

    Navigator 1.0 使用WillPopScope监听返回事件。
    Navigator 2.0 使用BackButtonListener监听返回事件。

    Navigator 1.0 返回监听

    关键代码

    class TwoPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _TwoPageState();
      }
    }
    
    class _TwoPageState extends State<TwoPage> {
      @override
      Widget build(BuildContext context) {
        return PageUtil.buildPage(
            _buildBody(),
            CommonTitleWidget(
              title: "Navigator1.0 Two Page",
              leftClick: () {
                Navigator.pop(context);
              },
            ));
      }
    
      Widget _buildBody() {
        return WillPopScope(
            child: Center(
              child: Text("This is two"),
            ),
            onWillPop: () {
              return _showDialog();
            });
      }
    
      Future<bool> _showDialog() async {
        var result = await showDialog<bool>(
          context: context,
          builder: (context) => new AlertDialog(
            title: new Text('Are you sure?'),
            content: new Text('some tip'),
            actions: <Widget>[
              new GestureDetector(
                onTap: () => Navigator.of(context).pop(false),
                child: Text("NO"),
              ),
              SizedBox(height: 16),
              new GestureDetector(
                onTap: () => Navigator.of(context).pop(true),
                child: Text("YES"),
              ),
            ],
          ),
        );
        if (result == true) {
          return Future.value(true);
        } else {
          return Future.value(false);
        }
      }
    }
    

    Navigator 2.0 返回监听

    关键代码

    class _TwoPageState extends State<TwoPage> {
      @override
      Widget build(BuildContext context) {
        return BackButtonListener(
          child: PageUtil.buildPage(
              _buildBody(),
              CommonTitleWidget(
                title: "Navigator 2.0 Two Page",
                leftClick: () {
                  AppRouterUtil.popPage(context);
                },
              )),
          onBackButtonPressed: _onBackPressed,
        );
      }
    
      Widget _buildBody() {
        return Center(
          child: Text("This is two"),
        );
      }
    
      Future<bool> _onBackPressed() async {
        var result = await showDialog<bool>(
          context: context,
          builder: (context) => new AlertDialog(
            title: new Text('Are you sure?'),
            content: new Text('some tip'),
            actions: <Widget>[
              new GestureDetector(
                onTap: () => Navigator.of(context).pop(false),
                child: Text("NO"),
              ),
              SizedBox(height: 16),
              new GestureDetector(
                onTap: () => Navigator.of(context).pop(true),
                child: Text("YES"),
              ),
            ],
          ),
        );
        if (result == true) {
          return Future.value(false);
        } else {
          return Future.value(true);
        }
      }
    }
    

    这里需要注意的是,这里处理的不一样。

      if (result == true) {
          return Future.value(false);
        } else {
          return Future.value(true);
        }
    

    查看BackButtonListener 源码,如果child自已处理事件,则返回true,否则反回false

      /// The callback function that will be called when the back button is pressed.
      ///
      /// It must return a boolean future with true if this child will handle the request;
      /// otherwise, return a boolean future with false.
      final ValueGetter<Future<bool>> onBackButtonPressed;
    

    相关的参考

    Add back button listener widget
    Learning Flutter’s new navigation and routing system
    flutter-navigator-2-0-and-deep-links

    示例代码

    flutter-dialog-back-button

    相关文章

      网友评论

          本文标题:flutter navigator2.0 返回键监听

          本文链接:https://www.haomeiwen.com/subject/iywdiltx.html