Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Flutter中如何使用WillPopScope大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Flutter中如何使用WillPopScope

WillPopScope

WillPopScope用于处理是否离开当前页面,在Flutter中有多种方式可以离开当前页面,比如AppBar、CuperTinoNavigationBar上面的返回按钮,点击将会回到前一个页面在Android手机上点击实体(虚拟)返回按钮,也将会回到前一个页面,此功能对于iOS程序员来说可能特别容易忽略。

以下几种情况我们会用到WillPopScope:

  1. 需要询问@L_944_8@是否退出
  2. App中有多个Navigator,想要的是让其中一个 Navigator 退出,而不是直接让在 Widget tree 底层的 Navigator 退出

询问@L_944_8@是否退出

在Android App中最开始的页面点击后退按钮,认会关闭当前activity并回到桌面,我们希望此时弹出对话框或者给出提示“再次点击退出”,避免@L_944_8@的误操作。

WillPopScope(
    onWillPop: () async => showDialog(
        context: context,builder: (context) =>
            AlertDialog(title: Text('你确定要退出吗?'),actions: <Widget>[
              RaisedButton(
                  child: Text('退出'),onPressed: () => Navigator.of(context).pop(true)),RaisedButton(
                  child: Text('取消'),onPressed: () => Navigator.of(context).pop(false)),])),child: Container(
      alignment: Alignment.center,child: Text('点击后退按钮,询问是否退出。'),))

Flutter中如何使用WillPopScope

我们也可以把效果做成快速点击2次退出

datetiR_133_11845@e _lastQuitTime;
WillPopScope(
    onWillPop: () async {
      if (_lastQuitTime == null ||
          datetiR_133_11845@e.Now().difference(_lastQuitTimE).inSeconds > 1) {
        print('再按一次 BACk 按钮退出');
        Scaffold.of(context)
            .showSnackBar(SnackBar(content: Text('再按一次 BACk 按钮退出')));
        _lastQuitTime = datetiR_133_11845@e.Now();
        return false;
      } else {
        print('退出');
        Navigator.of(context).pop(true);
        return true;
      }
    },))

Flutter中如何使用WillPopScope

App中有多个Navigator

我们的App通常是在@H_3_50@materialApp和CuperTinoApp下,@H_3_50@materialApp和CuperTinoApp本身有一个Navigator,所以认情况下调用Navigator.pop或者Navigator.push就是在操作此Navigator。不过在一些情况下,我们希望有自己定义的Navigator,比如如下场景:

  • 页面底部一个常驻bar,其上展示内容,这个常驻bar就需要一个自己的Navigator。
  • 在使用TabView、BottomNavigationBar、CuperTinoTabView这些组件时,希望有多个tab,但每个Tab中有自己的导航行为,这时需要给每一个Tab加一个Navigator。

首页

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key,this.titlE}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  GlobalKey<NavigatorState> _key = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WillPopScope(
          onWillPop: () async {
            if (_key.currentState.canPop()) {
              _key.currentState.pop();
              return false;
            }
            return true;
          },child: column(
            children: <Widget>[
              Expanded(
                child: Navigator(
                  key: _key,onGenerateRoute: (RouteSetTings setTings) =>
                      MaterialPageRoute(builder: (context) {
                    return OnePage();
                  }),),Container(
                height: 50,color: Colors.blue,alignment: Alignment.center,child: Text('底部Bar'),)
            ],)),);
  }
}

一个页面

class OnePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: RaisedButton(
            child: Text('去下一个页面'),onPressed: () {
              Navigator.push(context,MaterialPageRoute(builder: (context) {
                return TwoPage();
              }));
            },);
  }
}

第二个页面

class TwoPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: Text('这是第二个页面'),);
  }
}

@H_675_90@

使用TabView、BottomNavigationBar、CuperTinoTabView这些组件时也是一样的原理,只需在每一个Tab中加入Navigator,不要忘记指定key

交流

老孟Flutter博客地址(近200个控件用法):http://laomengit.com

欢迎加入Flutter交流群(微信:laomENGIt)、关注公众号【老孟Flutter】:

Flutter中如何使用WillPopScope

Flutter中如何使用WillPopScope

大佬总结

以上是大佬教程为你收集整理的Flutter中如何使用WillPopScope全部内容,希望文章能够帮你解决Flutter中如何使用WillPopScope所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: