Flutter 的 showDialog 和 showCupertinoDialog 有什么区别?

这篇具有很好参考价值的文章主要介绍了Flutter 的 showDialog 和 showCupertinoDialog 有什么区别?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

showcupertinodialog,客户端开发技术,flutter,ios
showcupertinodialog,客户端开发技术,flutter,ios

我将我的 App 里用的 Flutter 升级到了 3.19,没想到,以前我用 showDialog 和 AlertDialog 组合创建的二次确认框,变得无敌难看了,大幅度增加了整个框的圆角和里面默认按钮的圆角。不得已,我必须修改一下,以保持样式的美观。

此前,我使用的 showDialog,里面创建的 AlertDialog,这些默认都是 Material 风格的。不过,我此前试过,在 iOS 上的视觉表现也不错,虽然跟苹果的系统级弹框不太像,但是可以接受。

这次 Flutter 大改,导致这个弹框难看到炸裂,我想到的只能是苹果的换成苹果风格,那样至少看起来不是太奇怪。

然后我发现了有三个函数,showDialog,showCupertinoDialog,showAdaptiveDialog,我首先实验了,仍然使用 showDialog,但是里面 builder 返回的 Widget,我换成了 CupertinoAlertDialog,我发现,竟然毫无违和性。

我不禁好奇,那么 showCupertinoDialog 到底提供了什么独特的功能呢?在 sdk 里还看到了 showAdaptiveDialog,那么这个又是干什么?我发现 showAdaptiveDialog 只是按照 Platform 的取值,自动决定调用 showDialog 和 showCupertinoDialog。

那么问题就来了,showCupertinoDialog 到底有什么独特之处?实测就是大部分是一样的,只是有一些视觉上的细微差异,也有一点交互上的细微差异。如果你不是特别仔细认真的人,可能不会注意到。

不过这种仍然破坏了交互和视觉的一致性,对于设计师来说,往往是很辣眼睛的。

showCupertinoDialog 区别就在于,第一,弹出的模态对话框,其遮罩颜色是比较浅的,不像 Material 风格下,遮罩颜色较深,这个不对比着看,还不容易发现。

第二,弹出的模态框,在 Material 风格下,点击空白区域,可以直接取消掉模态框。但是在 Cupertino 风格下,不允许取消,必须显示点击“取消”按钮。这是交互上的一个小小的差异,不过这是苹果内在交互一致性的体验。

可惜,这些东西,如果你不去查文档,是很难了解到的,就算去查了文档,也不是很容易就掌握到这些差异的,至少我自己是没从文档看出来,而是从网友的分享里看出来的。

下面这种写法是我结合文档和网友的分享推理出来的,实测是没问题的。

void showCustomDialog(BuildContext context) {
  showAdaptiveDialog(
    context: context,
    builder: (BuildContext context) {
      // 检查运行平台
      if (Platform.isIOS) {
        // 使用 CupertinoAlertDialog
        return CupertinoAlertDialog(
          title: Text("iOS Alert"),
          content: Text("This is an iOS-style alert dialog."),
          actions: <Widget>[
            CupertinoDialogAction(
              child: Text("Cancel"),
              onPressed: () => Navigator.of(context).pop(),
            ),
            CupertinoDialogAction(
              child: Text("OK"),
              onPressed: () => Navigator.of(context).pop(),
            ),
          ],
        );
      } else {
        // 使用 AlertDialog
        return AlertDialog(
          title: Text("Android Alert"),
          content: Text("This is an Android-style alert dialog."),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text("Cancel"),
            ),
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text("OK"),
            ),
          ],
        );
      }
    },
  );
}

结论

用 showDialog 还是用 showCupertinoDialog 都是可以的。或者图省事,就用 showAdaptiveDialog。在 builder 里,用什么 Dialog 决定了出现后的样式,比如 AlertDialog 和 CupertinoAlertDialog 长得就不一样。不过无论外面用什么函数来调用,里面的都可以随意组合的。只是考虑到系统的交互规范和视觉一致,一般不会混用。

推荐使用 showAdaptiveDialog,里面则根据 Platform.isIOS 等来决定是返回 CupertinoAlertDialog 和是返回 AlertDialog。用错了不会报错的,可以工作,只是丑。文章来源地址https://www.toymoban.com/news/detail-857684.html

到了这里,关于Flutter 的 showDialog 和 showCupertinoDialog 有什么区别?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Flutter 面试题】Dart是什么?Dart和Flutter有什么关系?

    【Flutter 面试题】Dart是什么?Dart和Flutter有什么关系?

    【Flutter 面试题】Dart是什么?Dart和Flutter有什么关系? 👏🏻 正在学 Flutter 的同学,你好! 😊 本专栏是解决 Flutter 面试过程中可能出现的问题,而进行汇总整理的。一个问题一篇文章,尽可能详细解答,满足面试需求。 🔍 想解决开发中的零散问题?碎片化教程 👉 Flutte

    2024年02月22日
    浏览(12)
  • 【Flutter 面试题】Flutter 是什么?它与其他移动开发框架有什么不同?

    【Flutter 面试题】Flutter 是什么?它与其他移动开发框架有什么不同?

    👏🏻 正在学 Flutter 的同学,你好! 😊 本专栏是解决 Flutter 面试过程中可能出现的问题,而进行汇总整理的。一个问题一篇文章,尽可能详细解答,满足面试需求。 🔍 想解决开发中的零散问题?碎片化教程 👉 Flutter Tips 。 🔍 想深入学习 Flutter?系统化教程 👉 Flutter 从

    2024年01月24日
    浏览(16)
  • flutter 简介 flutter 能为我们做什么

    flutter 简介 flutter 能为我们做什么

    陆陆续续已经写了60多篇的flutter 的文章了,本篇文章就来说说我对flutter 的简单看法 Flutter是一种由谷歌开发的开源用户界面(UI)工具包,用于在多个平台上构建高性能、美观和流畅的移动应用程序。它使用Dart编程语言,并提供丰富的UI组件和工具,可以快速构建现代化的应

    2024年02月16日
    浏览(8)
  • 【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗?

    【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗?

    【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗? 关于我 , 小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flutter 的同学,你好! 😊 Flutter 面试宝典 是解决 Flutter 面试过程中

    2024年03月22日
    浏览(14)
  • Flutter 3.16 发布,快来看有什么更新吧

    Flutter 3.16 发布,快来看有什么更新吧

    参考原文:https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1 Flutter 又又又发布新季度更新啦,同时随着而来的还有 Dart 3.2,本次 3.16 开始 Material 3 会成为新的默认主题,另外 Android 也迎来了 Impeller 的预览支持,另外还有 Flutter Casual Games Toolkit 的重大更新。 最重要的是,Im

    2024年02月04日
    浏览(13)
  • 网络带宽与宽带的区别是什么 有什么区别

        带宽 又叫频宽是指在固定的时间可传输的资料数量,亦即在传输管道中可以传递数据的能力。在数字设备中,频宽通常以bps表示,即每秒可传输之位数。在模拟设备中,频宽通常以每秒传送周期或赫兹Hertz (Hz)来表示。频宽对基本输出入系统 (BIOS ) 设备尤其重要,如快速

    2024年02月05日
    浏览(7)
  • 什么是冲突域,什么是广播域?区别又是什么

    什么是冲突域,什么是广播域?区别又是什么

    在传统的以粗同轴电缆为传输介质的以太网中,同一介质上的多个节点共享链路的带宽,争用链路的使用权,这样就会发生信号冲突现象,导致数据无法被转发。这样的一个区域被称为冲突域。   产生条件: 1. 物理介质(同轴电缆,HUB) 2. 共享式网络(同一网段同一局域网

    2024年02月05日
    浏览(19)
  • podman 是什么?和 docker 有什么区别?

    Podman 是一种无守护进程的容器引擎,可以创建、管理和运行 OCI 容器,容器可以以非 root 身份运行(也可以使用 root 身份运行)。Podman 是由 Red Hat 开发,从 Red Hat Enterprise Linux 7 开始,Podman 成为了默认的容器引擎。 Podman 遵守了 OCI(开放容器倡议)规范,可以轻松查找、运行

    2024年02月16日
    浏览(8)
  • TypeScript是什么?它与JavaScript有什么区别?

    面试题-TS(1):TypeScript是什么?它与JavaScript有什么区别? TypeScript是一种编程语言,它是JavaScript的超集。它通过添加静态类型、类、接口和模块等功能来扩展JavaScript。 JavaScript是一种广泛应用于Web开发的脚本语言,它的灵活性和易用性使得它成为了开发者们的首选。然而,JavaS

    2024年02月16日
    浏览(10)
  • 【面试合集】说说什么是进程?什么是线程?区别?

    【面试合集】说说什么是进程?什么是线程?区别?

    操作系统中最核心的概念就是进程,进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位 操作系统的其他所有内容都是围绕着进程展开的,负责执行这些任务的是 CPU 进程是一种抽象的概念,从来没有统一的标准定义看,一般由程序、数据集合和进

    2024年01月20日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包