美文网首页Flutter圈子Flutter
flutter中的onBackPressed()

flutter中的onBackPressed()

作者: longforus | 来源:发表于2019-01-09 15:45 被阅读4次

    在安卓开发中有时候我们需要监听用户的返回键点击事件,在里面根据要求做判断来决定是返回还是弹窗等其他操作.就像這样:

    override fun onBackPressed() {
           if (allowBack){
               super.onBackPressed()
           }else{
               do something ...
           }
        }
    

    最近学习flutter,做了一个看图的APP:fPix,在做下载目录选择功能的时候用到了《flutter版的文件管理器》的代码,其中需要拦截返回键事件做判断以回到上级目录,开始没有发现作者代码中的一些逻辑,导致我按返回键直接退出了APP,开始是以为需要实现onBackPressed()类似的逻辑来判断.经过百度发现可以添加RawKeyboardListener实现按键事件的监听:

    class _DirSelectorState extends State<DirSelector> {
      
      FocusNode _backNode = new FocusNode();
    
      @override
      Widget build(BuildContext context) {
        FocusScope.of(context).requestFocus(_backNode);
        return Scaffold(
              appBar: AppBar(
                title: Text(
                  parentDir?.path == sDCardDir
                      ? 'SD Card'
                      : parentDir.path.substring(parentDir.parent.path.length + 1),
                  style: TextStyle(color: Colors.white),
                ),
                elevation: 0.4,
                centerTitle: true,
                  //使用RawKeyboardListener进行包裹.
                leading: new RawKeyboardListener(
                    focusNode: _backNode ,
                    onKey: (event) {
                      if (event.runtimeType.toString() == 'RawKeyDownEvent'&&event.data is RawKeyEventDataAndroid) {
                        RawKeyEventDataAndroid data = event.data;
                        print('code=${data.keyCode}');
                          //获取到keyCode进行判断,4就是返回键
                        if(data.keyCode==4){
                            //执行相应的逻辑,回到上层或者pop
                          if (parentDir.path != sDCardDir) {
                            initDirectory(parentDir.parent.path);
                            jumpToPosition(false);
                          } else {
                            Navigator.pop(context);
                          }
                          return true;
                        }
                      }
                      return false;
                    },
                    child: IconButton(
                        icon: Icon(
                          Icons.chevron_left,
                          color: Colors.white,
                        ),
                        onPressed: () {
                          if (parentDir.path != sDCardDir) {
                            initDirectory(parentDir.parent.path);
                            jumpToPosition(false);
                          } else {
                            Navigator.pop(context);
                          }
                        })),
              ),
              backgroundColor: Color(0xfff3f3f3),
              body: Scrollbar(
                  .......
                ),
              ));
      }
    }
    

    這样的可以实现监听和判断的,但是做完了发现还是一按返回键就退出了,后来才发现这位作者通过其他方式做了判断和监听,并调用了SystemNavigator.pop();导致APP退出了,他的实现方法是添加WillPopScope,感觉比添加RawKeyboardListener方便很多.

    class _DirSelectorState extends State<DirSelector> {
      
      @override
      Widget build(BuildContext context) {
        return WillPopScope(
        //按返回键时這里会被调用
          onWillPop: () {
            if (parentDir.path != sDCardDir) {
              initDirectory(parentDir.parent.path);
              jumpToPosition(false);
            } else {
            //pop当前的widget
              Navigator.pop(context);
            }
          },
          child: Scaffold(
              appBar: AppBar(
                title: Text(
                  parentDir?.path == sDCardDir
                      ? 'SD Card'
                      : parentDir.path.substring(parentDir.parent.path.length + 1),
                  style: TextStyle(color: Colors.white),
                ),
                elevation: 0.4,
                centerTitle: true,
                leading: IconButton(
                        icon: Icon(
                          Icons.chevron_left,
                          color: Colors.white,
                        ),
                        onPressed: () {
                          if (parentDir.path != sDCardDir) {
                            initDirectory(parentDir.parent.path);
                            jumpToPosition(false);
                          } else {
                            Navigator.pop(context);
                          }
                        })),
              ),
              backgroundColor: Color(0xfff3f3f3),
              body: Scrollbar(
                ......
        );
      }
    }
    

    这就是我现在了解的2种flutter中实现onBackPressed() 的方法,笔记备查.

    相关文章

      网友评论

        本文标题:flutter中的onBackPressed()

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