美文网首页
第七章: 功能型组件 7.1 导航返回拦截(WillPopSco

第七章: 功能型组件 7.1 导航返回拦截(WillPopSco

作者: QYCD | 来源:发表于2022-09-07 17:11 被阅读0次

    跟随《Flutter实战·第二版》学习,建议直接看原书

    为了避免用户误触返回按钮而导致 App 退出,在很多 App 中都拦截了用户点击返回键的按钮,然后进行一些防误触判断,比如当用户在某一个时间段内点击两次时,才会认为用户是要退出(而非误触)。Flutter中可以通过WillPopScope来实现返回按钮拦截,我们看看WillPopScope的默认构造函数:

    const WillPopScope({
      ...
      required WillPopCallback onWillPop,
      required Widget child
    })
    

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

    示例

    为了防止用户误触返回键退出,我们拦截返回事件。当用户在1秒内点击两次返回按钮时,则退出;如果间隔超过1秒则不退出,并重新记时。代码如下:

    class WillPopScopeTestRoute extends StatefulWidget {
      @override
      WillPopScopeTestRouteState createState() {
        return WillPopScopeTestRouteState();
      }
    }
    
    class WillPopScopeTestRouteState extends State<WillPopScopeTestRoute> {
      DateTime? _lastPressedAt; //上次点击时间
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("返回"),
          ),
          body: WillPopScope(
            onWillPop: () async {
              if (_lastPressedAt == null ||
                  DateTime.now().difference(_lastPressedAt!) > Duration(seconds: 1)) {
                //两次点击间隔超过1秒则重新计时
                _lastPressedAt = DateTime.now();
                return false;
              }
              return true;
            },
            child: Container(
              alignment: Alignment.center,
              child: Text("1秒内连续按两次返回键退出"),
            ),
          ),
        );
      }
    }
    
    Simulator Screen Shot - iPhone 13.png

    相关文章

      网友评论

          本文标题:第七章: 功能型组件 7.1 导航返回拦截(WillPopSco

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