flutter中的onBackPressed()

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

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

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

class _DirSelectorState extends State {
  
  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 {
  
  @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())