zoukankan      html  css  js  c++  java
  • Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序

    如需转载,请注明出处:Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序

    在实际开发中,为了防止用户误触返回按钮导致程序退出,通常会设置为在1秒内连续点击两次才会退出应用程序。Android中一般的处理方式是在onKeyDown方法内做计时处理,当keyCode == KeyEvent.KEYCODE_BACK 且 两次点击返回按钮间隔时间小于1秒则退出应用程序,在Flutter中可以通过WillPopScope来实现拦截返回按钮,并且在其内部做计时处理。

    WillPopScope构造函数:

    const WillPopScope({
      Key key,
      @required this.child,
      @required this.onWillPop,//回调函数,当用户点击返回按钮时调用
    })

    onWillPop是一个回调函数,当用户点击返回按钮时被调用,这里的返回按钮包括导航返回按钮及物理返回按钮,该回调需要返回一个Future对象,如果返回的Future最终值为false时,当前路由不出栈(不返回),如果返回为true时,则当前路由出栈退出。

    下面的Demo是实现了在1秒内连续点击两次退出应用程序的功能。想要做到计时处理,就需要获取到当前时间,计算两次点击之间的时间差

    获取当前时间:

    DateTime.now()

    计算当前时间和上次点击的时间差:

    DateTime.now().difference(_lastPressedAt)

    时间差判断(是否大于1秒):

    DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)

    完整Demo示例:

    import 'package:flutter/material.dart';
    
    void main() => runApp(DemoApp());
    
    class DemoApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return new DemoAppState();
      }
    }
    
    class DemoAppState extends State<DemoApp> {
      DateTime _lastPressedAt;//上次点击的时间
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'WillPopScope Demo',
          home: new Scaffold(
            appBar: new AppBar(
              title: new Text('WillPopScope Demo'),
            ),
            body: new WillPopScope(
                child: new Center(
                  child: new Text('WillPopScope'),
                ),
                onWillPop: () async{
                  if(_lastPressedAt == null || (DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1))){
                    //两次点击间隔超过1秒,重新计时
                    _lastPressedAt = DateTime.now();
                    print(_lastPressedAt);
                    return false;
                  }
                  return true;
                }
            ),
          ),
        );
      }
    }

     

  • 相关阅读:
    基于ExtAspNet的开源项目 Ext4JSLint
    ExtAspNet应用技巧(九) Grid导出为Excel文件
    ExtAspNet应用技巧(十二) 系统登录
    ExtAspNet v2.0.7
    原来最可怕的不是工作,是无聊
    获取Word文档的作者和主题
    《可变范围规约》
    用IronPython加载,写入文本文件
    IronPython中没有System.Data命名空间?
    《敏捷建模》读后感
  • 原文地址:https://www.cnblogs.com/upwgh/p/11466544.html
Copyright © 2011-2022 走看看