• Flutter自定义对话框返回相关问题汇总


    Flutter自定义对话框,禁用系统返回按钮 - WillPopScope

    使用WillPopScope即可,重点onWillPop方法:

    Future<bool> _onWillPop()=>new Future.value(false); 
    

    由于要弹出dialog,我这里是禁掉返回按钮,当然也可以在这里做一下其他操作,比如连续点击两次返回,又或者连续pop两次把dialog和页面一起返回掉。

    1. import 'package:flutter/material.dart';
    2. class RewriteShowDialog {
    3. RewriteShowDialog({
    4. @required this.context,
    5. this.child,
    6. this.barrierColor = Colors.black54,
    7. this.barrierDismissible = false,
    8. this.elevation = 0,
    9. this.padding
    10. }){
    11. _showGeneralDialog(
    12. barrierDismissible: barrierDismissible,
    13. barrierColor: barrierColor,
    14. builder: (BuildContext context) {
    15. /// AnimatedPadding代替dialog
    16. /// dialog没有提供修改padding的属性,本身也是调用的AnimatedPadding
    17. Future<bool> _onWillPop()=>new Future.value(false);
    18. return WillPopScope(
    19. onWillPop:_onWillPop,
    20. child: AnimatedPadding(
    21. padding: padding == null ? EdgeInsets.symmetric(horizontal: 32, vertical: 24) : padding,
    22. duration: Duration(milliseconds: 100),
    23. curve: Curves.decelerate,
    24. child: MediaQuery.removeViewInsets(
    25. removeLeft: true,
    26. removeTop: true,
    27. removeRight: true,
    28. removeBottom: true,
    29. context: context,
    30. child: Center(
    31. child: Material(
    32. elevation: elevation,
    33. borderRadius: BorderRadius.circular(12),
    34. child: child
    35. ),
    36. ),
    37. ),
    38. ),
    39. );
    40. }
    41. );
    42. }
    43. final BuildContext context;
    44. /// 内容
    45. final Widget child;
    46. /// 点击背景是否可以关闭弹窗
    47. final bool barrierDismissible;
    48. /// 背景颜色
    49. final Color barrierColor;
    50. /// 阴影
    51. final double elevation;
    52. /// 内边距
    53. final EdgeInsets padding;
    54. /// 重写showGeneralDialog
    55. /// 系统自带的背景背景透明不能修改
    56. void _showGeneralDialog({
    57. Widget Function(BuildContext) builder,
    58. Widget child,
    59. bool barrierDismissible,
    60. Color barrierColor
    61. }) {
    62. showGeneralDialog(
    63. context: context,
    64. pageBuilder: (BuildContext buildContext, Animation<double> animation, Animation<double> secondaryAnimation) {
    65. final Widget pageChild = child ?? Builder(builder: builder);
    66. return SafeArea(
    67. child: Builder(
    68. builder: (BuildContext context) {
    69. return pageChild;
    70. }
    71. ),
    72. );
    73. },
    74. barrierDismissible: barrierDismissible,
    75. barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
    76. barrierColor: barrierColor,
    77. transitionDuration: const Duration(milliseconds: 150),
    78. transitionBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
    79. return FadeTransition(
    80. opacity: CurvedAnimation(
    81. parent: animation,
    82. curve: Curves.easeOut,
    83. ),
    84. child: child,
    85. );
    86. },
    87. );
    88. }
    89. }

    Flutter 关闭弹框并finish掉当前页面

    场景描述:

    在一个用户登录退出的场景模式下,并关闭掉当前页面,场景可能类似如下:

    在这里插入图片描述

    如图,当我们点击确定退出按钮,去请求接口,请求成功后,关闭当前dialog,然后再退出当前页面。

    上部分代码:

    setting_page.dart

    1. // 弹框
    2. void showLoginOutDialog() {
    3. showDialog(
    4. context: context,
    5. barrierDismissible: false, // 点击外部不消失
    6. builder: (BuildContext context){
    7. return CommonDialog(
    8. title: "确定退出当前账号?",
    9. onNavClickListener: (){
    10. print("onNavClickListener ");
    11. Navigator.of(context).pop(1);
    12. },
    13. onPosClickListener: (){
    14. print("loginaa ");
    15. Navigator.of(context).pop(1);
    16. _loginOut();
    17. },
    18. );
    19. }
    20. );
    21. }
    22. // 退出网络请求,这里的pop("login_out")为标志,进行退出后页面的刷新操作。
    23. void _loginOut() async{
    24. DataUtils.loginOut().then((res){
    25. print("res $res");
    26. if (res) {
    27. ToastUtil.showBottomToast("退出成功");
    28. Navigator.of(context).pop("login_out");
    29. }else {
    30. ToastUtil.showBottomToast("退出失败");
    31. }
    32. }).catchError((onError){
    33. print("onError $onError");
    34. });
    35. }

    页面弹出/返回时 return Future.value(false) 的作用

    当我们在 flutter 应用中,跳转到其他 app 或者返回桌面时会这么调用

     同样的我们退出当前页面时,调用 Navigator.pop(context) 后同样也会调用 return Future.value(false) 这是为什么呢?

    原因

    首先我们要知道不调用会怎么样?

    不调用会怎么样

    • 如果我们在调用 Navigator.pop(context, false) 之后
    • 使用的是 return Future.value(true);
    • 那么按下后退按钮后,应用程序将显示黑屏,logcat中没有错误。

    为什么使用

    • 当我们使用 Navigator.pop(context),Future.value(true); 手动导航,会触发另一个无法完成的弹出窗口
    • 这是由于当前已经存在页面,所以这会使应用程序崩溃。
    • 这时由于 OnWillPop 需要返回,因此通过使用 return Future.value(false);告诉 OnWillPop 我们在此处处理页面的关闭

     

  • 相关阅读:
    Kotlin Class 自定义类
    354俄罗斯套娃信封问题
    【 C++ 】set、multiset的介绍和使用
    IP 核之 MMCM/PLL 实验
    C++知识点2:把数据写进switch case结构,和写进json结构,在使用上有什么区别
    探索Redis与MySQL的双写问题
    Mac开发指南
    LeetCode - 解题笔记 - 215 - Kth Largest Element in an Array
    小样本数据集 (Few-shot Learning)
    车载软件架构 —— 持续集成持续交付
  • 原文地址:https://blog.csdn.net/jdsjlzx/article/details/128071347