在安卓开发中有时候我们需要监听用户的返回键点击事件,在里面根据要求做判断来决定是返回还是弹窗等其他操作.就像這样:
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() 的方法,笔记备查.