【翻译】Dart和Flutter是什么?

2023-11-17

Dart是在Go之后从谷歌出现的,最近作为Flutter跨平台前端框架背后的语言,其受欢迎程度激增。这对那些对云原生基础设施感兴趣的人来说很重要,因为有一种对 "全栈Dart "的推动,Flutter开发者可以使用相同的语言来构建他们应用程序背后的服务。Dart支持超前(AOT)编译,这意味着它可以创建快速启动的轻量级二进制文件,使其很适合功能即服务(FaaS)环境。

翩翩

Flutter是谷歌的UI工具包,用于从一个代码库中为移动、网络、桌面和嵌入式设备构建漂亮的、本地编译的应用程序。

自从Dart作为 "结构化网络编程的新编程语言 "推出以来,它一直以前端开发者为目标,并在Flutter跨平台框架中找到了吸引力。Flutter 1的应用程序可以被部署到安卓和iOS。有了Flutter 2,应用程序也可以为网络和桌面建立。Canonical选择Flutter作为新的Ubuntu桌面安装程序的基础。对于作者所在的@公司来说,选择Dart是因为它在服务器端具有类似于Erlang的功能,同时还能用Flutter构建全栈应用程序。鉴于Flutter背后的势头,以及它被谷歌使用,它似乎不太可能加入 "被谷歌杀死 "的墓碑。

尽管有React Native、Xamarin、Ionic和Cordova等其他框架的激烈竞争,Flutter的受欢迎程度仍在上升,这使得Dart在RedMonk编程语言排名中被推至第20位。2021年6月

上一季度,我们讨论了Dart在长期停滞后的显著上升,这种上升几乎可以肯定归功于流行的Flutter框架,并提出了一个问题,即Dart是否已经完成了移动,或者它是否有足够的动力将其带入前20名。四分之一之后,我们得到了答案,Dart首次进入前20名,在这个过程中取代了Perl。这一成就在手,现在的问题是Dart是否能维持前20名的排名,如果是的话,它是否能继续在排行榜上前进。

全栈式Dart

谷歌在2021年I/O大会上发出的信息几乎是:"如果你学会了Dart来编写Flutter应用程序,为什么不使用它来实现谷歌云平台的后端服务呢?他们把这称为,"全栈Dart"。在随后的Flutter开发者活动中,如Geekle 2021,来自AWS和Azure的代表出现了,他们的信息归结为:"你也可以在我们的云上运行基于Dart的服务"。

语言特点

"Dart是一种客户端优化的语言,适用于任何平台上的快速应用"
-dart.dev

Dart是一种强类型的、垃圾收集的、面向对象的语言,具有类似C语言的语法。因此,对于任何使用过Java或C#的人来说,它看起来非常熟悉,而且许多相同的模式(和反模式)都适用。

你好,世界


void main() { print('Hello, World!'); }

就像Java一样,创建对象很容易被使用一次,然后被扔掉,等待垃圾回收。

垃圾反模式


var args = ['parent-element', 'child-element']; # 创建一个要传递的参数对象 var value = getValue(args); # 创建一个结果对象并调用函数 if (value != null) { # 结果对象的空测试值 return value; # 返回结果对象 }

许多JavaScript程序员都会熟悉的async/await模型是用来支持异步编程的,这对基于事件的应用特别有用

异步函数示例


Future<String> createOrderMessage() async { var order = await fetchUserOrder(); return 'Your order is: $order'; } Future<String> fetchUserOrder() => // Imagine that this function is // more complex and slow.
    Future.delayed(const Duration(seconds: 2), () => 'Large Latte', ); Future<void> main() async { print('Fetching user order...'); print( await createOrderMessage()); }

并发是通过隔离器实现的--"类似于线程但不共享内存的独立工作者,仅通过消息进行通信",但在部署到浏览器时除外,此时应使用HTML5 Web工作者来代替。该语言的这一方面让人联想到Erlang进程,而且实现行为者模型也很简单。

该语言和核心包采用3-Clause BSD许可,许多第三方包也使用该许可。

pub.dev软件包管理器

Dart的软件包管理器是pub.dev,应用程序的依赖关系在pubspec.yaml文件中定义,该文件可以引用发布的软件包和Git URL中的软件包。任何拥有谷歌账户的人都可以发布软件包,但该网站支持基于DNS的验证发布者的概念,为软件包提供一定程度的来源。软件包也会使用 "pub积分 "进行评分,评分标准包括:遵守文件惯例、文档、多平台支持、通过静态分析、依赖关系是否是最新的,以及是否支持健全的无效安全。

pub.dev公共API有一些端点,用于列出IDE中包名完成的顶级包,以及列出一个包的所有版本。

及时和提前的编译

当在Dart虚拟机(VM)中运行应用程序时,它支持与其他基于VM的语言类似的及时编译(JIT)。这在启动时间和长期效率之间产生了通常的交易,因为虚拟机已经能够优化运行代码。Dart虚拟机包括一个剖析器,最初被称为 "Observatory",它可以与DevTools调试和性能套件一起使用。

JIT的替代方案是提前编译(AOT),Dart SDK为Arm、Arm64、x86或x64创建本地二进制文件,或为部署在浏览器上的应用程序创建JavaScript。AOT二进制文件的启动时间非常短,这使得它们很适合 "无服务器 "环境,如功能即服务(FaaS)。

然而,目前还没有任何FaaS平台原生支持Dart,这意味着应用程序必须被打包成容器,并在支持容器化应用程序的各种平台上运行。谷歌已经创建了Dart的功能框架,为构建FaaS提供一些脚手架。该框架被设计成可以在本地运行,也可以在Google Cloud Run、Google App Engine和基于Knative的环境中运行。它包括一个全栈实例,在后端运行一个Dart服务,在前端使用Flutter桌面/网络应用。

Docker上的Dart

自2021年5月以来,DockerHub上已经有了一个官方的Dart镜像,其中包括Dart SDK的debian:buster-slim镜像。

Dart是一种动态链接的语言,所以不像Go,它不可能创建一个静态链接的二进制文件,可以放在一个 "从头开始 "的空容器中。为了获得类似的小容器,Dart镜像包括一个/runtime目录,其中包含了最小的平台库工作集。一个微不足道的 "Hello World "类型的应用程序适合于3.5-4.5MB,这取决于底层平台的架构。


FROM dart AS build WORKDIR /app COPY ./mydemoapp.dart . RUN dart pub get RUN dart compile exe /app/mydemoapp.dart -o /app/mydemoapp FROM scratch COPY --from=build /runtime/ / COPY --from=build /app/mydemoapp /app/mydemoapp ENTRYPOINT ["/app/mydemoapp" ]

多平台和架构支持

Dart SDK可用于Windows(x86和x64)、Linux(x86、x64、Arm和Arm64)和MacOS(x64和Arm64)的开发。SDK可以为它所运行的平台创建本地二进制文件,但目前不支持交叉编译。因此,创建多架构的二进制文件需要多架构的构建基础设施,或使用仿真技术(如QEMU与Docker Buildx)。

官方的Dart镜像只支持linux:amd64,对Arm/Arm64的支持来自社区分叉。

Flutter支持交叉编译,因此Android的原生二进制文件、各种桌面的原生二进制文件以及Web应用程序都可以从任何支持的平台上构建和测试(尽管构建和发布iOS应用程序仍然需要Mac和Xcode)。

新功能

Dart正处于积极的开发阶段,新功能的出现使该语言更快、更安全、更灵活。

健全的空值安全

在2021年3月发布的Dart 2.12(与Flutter 2一起)中,健全的空值安全意味着类型默认为不可空值。这意味着在运行时出现的空引用错误,可以在编辑和编译过程中被识别出来。我们仍然可以通过在类型声明中添加"?"来声明可归零的变量,所以开发者可以控制他们如何使用这一特性。


// var i = 42; // 推断为一个int. String name = getFileName(); final b = Foo(); // 要表明一个变量可能有null的值,//只需在其类型声明中添加? int? aNullableInt = null;

引入健全的null安全被认为是对pub.dev中的软件包的一个突破性改变,谷歌建议主要的版本号应该被提升到null安全兼容的版本。几个月后,大多数流行的软件包(以及它们的底层依赖关系)都采用了健全的null安全,这表明生态系统是活跃的,能够接受变化。

网络装配

Dart正在进行实验,以便能够编译成Web Assembly(WASM)模块,这在一定程度上依赖于WebAssemby/gc,以提供对垃圾收集语言的更好支持。

Dart也可以通过基于Wasmer运行时的:wasm包来使用WASM模块。这为Dart应用程序以独立于平台的方式使用C、C++、Rust等库打开了大门(这应该比由外国函数接口[ffi]提供的C互操作要灵活得多)。

如果你 不熟悉 Web Assembly,你可能想阅读Kevin Hoffman 在WTF上 迷你系列 文章),它提供了一个很好的简明概述。

集成开发环境

在可用的开发者工具方面,Dart和Flutter有很多不错的选择。Flutter的入门指南引导用户使用基于JetBrain的IntelliJ IDEA的Android Studio

通过使用Dart Code扩展,Dart和Flutter在VS Code中也有良好的支持。

另外,还可以使用DartPad在浏览器中编辑和测试应用程序,DartPadDart教程中被广泛使用。

粗糙的边缘

正如我们所看到的,Dart具有广泛的功能。然而,也有一些令人沮丧的地方。

YAML

YAML被Dart广泛使用,尤其是在pubspec.yaml文件中定义依赖关系。YAML解析器是pub.dev上的一个包,它的出现让人失望。

这个库目前不支持转储到YAML。你应该使用dart:convert的json.encode来代替。

对于大多数客户端应用程序来说,仅仅解析YAML通常是没有问题的。但是不能转储YAML(支持V1.2版本和跳转)对于服务器端应用程序和命令行工具来说是个麻烦,而且往往意味着Python脚本或类似的东西需要被带入Dart构建管道,因为不能使用纯Dart方法。

TLS

Dart支持TLS 1.0和1.1,这两个版本现在已经过时了,但是还没有办法指定1.2为最小版本,这就使应用程序有可能受到降级攻击。在SDK repo上有许多问题正在寻求解决这个问题,#37173最近指出。"这是一个内部客户的P1"。

发布通知

Dart SDK存档页面上有各种渠道(稳定版、测试版和开发版)的最新版本号,但没有简单的方法(如RSS订阅)来订阅更新。Dart公告谷歌小组只提供了稳定版的次要版本(不是补丁),而GitHub上的SDK发布页面则对开发版的发布过于嘈杂。也许最好的来源是dart-docker repo中的version.json

社区

Dart语言社区是作为更大的Flutter社区的一个子集而存在的,它跨越了通常选择的在线会议场所和通过各种活动的物理世界(因为事情回到了人际交往)。

Dart和Flutter是谷歌开发者专家(GDEs)的两个独立类别,尽管在实践中,它们之间有巨大的重叠。

如果你想尝试Dart

最好的开始是Dart教程页面,它有关于基础知识、服务器端Dart和网络应用的部分。许多教程都使用了Dart Pad,这样就可以在浏览器中编辑和运行示例代码,这意味着不需要安装任何东西就可以开始使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【翻译】Dart和Flutter是什么? 的相关文章

  • 【翻译】 迁移到Python 3

    本文由LWN用户为您带来LWN net的订阅者使得这篇文章 以及它周围的一切 成为可能 如果您喜欢我们的内容 请购买订阅 使下一组文章成为可能 2011年2月9日 本文由Ian Ward提供 Python 3 0于2008年底发布 但到目前
  • 【翻译】我们建立了一个.NET操作员SDK(所以您不必这样做)。

    我们用C 语言构建了一个 NET操作者SDK 因此您可以用C 或任何 NET语言构建自己的Kubernetes操作者 当然也 有Go Operator SDK 还有我们的Java Operator SDK 那么为什么不为 NET社区提供一些
  • google翻译的一个错误

    如图 音标标着yi朗读却是ai
  • 沉浸式翻译 安装及使用

    介绍一下最近非常或的沉浸式翻译工具 非常有助于外文阅读 包括网页 pdf等 可以同时显示原文和译文 操作简单 使用起来还是非常友好的 先上链接 介绍 沉浸式翻译 如何使用 沉浸式翻译 1 安装 支持Edge Chrome Firefox和S
  • 【翻译】fancyBox 3中文文档

    fancyBox3 中文文档 译文永久地址 https kangkai124 github io fancybox 说明 本文档仅供参考 更新不及时请查看官方文档 1 介绍 fancyBox是一个JavaScript库 它以优雅的方式展示图
  • 冰羚中间件 RouDi usage-guide.md翻译

    内容 内容 配置RouDi Configuring RouDi RouDi可以支持读取从一个配置文件中读取mempool config 如果需要支持这个特性 CMake的编译选项中需要使用 DTOML CONFIG on mempool c
  • 各国语言对应翻译表

    为了工作方便 自己做了一个地区语言的英文翻译 让自己可以更快的找到自己需要的地方 同时 分享给大家 谢谢 中文 各国语言 翻译 序号 中文 翻译 1 阿尔巴尼亚语 2 阿拉伯语 3 阿姆哈拉语 4 阿塞拜疆语 Az rbaycan 5 爱尔
  • 【ES实战】Search的滚动查询(Scroll)

    滚动查询 Scroll 虽然搜索请求返回结果是单个 页面 但scroll API 可用于从单个搜索请求中检索大量结果 甚至所有结果 其方式与在传统数据库使用相似 scrolling不是用于实时用户请求 而是用于处理大量数据 例如 为了将一个
  • 【翻译】 Linux 与无人机的未来

    请考虑订阅 LWN订阅是 LWN net 的生命线 如果您喜欢这些内容并希望看到更多 您的订阅将有助于确保 LWN 继续蓬勃发展 请访问此页面加入我们 让 LWN 继续在网络上传播 作者 Nathan Willis 2015 年 10 月
  • 人工智能革命:超级智能之路(上)

    这篇文章翻译于Tim Urban大神的 The AI Revolution 的系列文章 下面让我们一起领略一下Tim Urban大神理解的人工智能革命是怎样的吧 文章目录 遥远的未来 即将到来 超级智能之路 人工智能 我们目前在哪里 一个在
  • 【翻译】我们能从英国教育考试院的算法失败中学到什么?

    如果你想找一个表面上聪明的人是如何不小心把别人的生活搞得一团糟的例子 那就看看去年英国公开考试的情况吧 简而言之 政府认识到科维德 19的威胁 取消了英国学生的公开考试 在寻求另一种评分方法时 政府及其教育监管机构可以说是由于无知或选择而违
  • 看在上帝的份上,不要使用 .npmignore

    译者 Lara npmignore 是一个可以给Node js项目造成严重危害的文件 你应该立即停止使用该文件 除了下面所列的一种情况 npm中已经永久内置了一个更好的替代文件 并且更易用更安全 什么是 npmignore 比如我下载了一个
  • 【翻译】什么是 "政策即守则"?

    身份很容易 毕竟 每个人都有一个 认证 可能就更不复杂了 任何使用智能手机的人每天都要认证几十次才能使用它 这甚至还没有涉及银行 工作或社交媒体所需的远程服务 也许正是这种明显的简单性吸引了我在大约五六年前进入身份系统的世界 在这之前的几年
  • 【翻译】BItcoin数据结构——UTXO definition-Investopedia

    原文 https www investopedia com terms u utxo asp UTXO意味着什么 UTXO代表比特币交易的未花费的输出 每个比特币交易都以用于平衡分类账的硬币开始 UTXO会不断处理 并负责开始和结束每笔交易
  • gitlab CI/CD :创建一个复杂的pipeline流水线

    教程内容原文地址 Tutorial Create a complex pipeline 当前教程版本 16 1 文章目录 先决条件 创建一个项目来保存 Docusaurus 文件 创建初始CI CD的配置文件 添加一个job来构建站点 添加
  • 【翻译】白人男性在改善性别多样性方面的作用是什么?

    我们都知道 或者说现在应该知道 多元化的团队和组织更成功 更有创造力 有更好的留任率 并能带来更健康的工作场所文化 强调这些观点的数据是很多的 然而 技术团队在这方面往往是落后的 艾米丽 张在她的书 Brotopia 中认为 在一个如此有力
  • Kotlin Lazy vs Lateinit 属性. 何时使用哪个属性?

    原文链接 Kotlin提供了许多很棒的特性 我们可以利用这些功能 快速构建高质量的应用程序 在所有这些特性中 lateinit 和 lazy 是重要的初始化属性 有必要知道何时使用 lateinit 以及何时使用 lazy 初始化 late
  • 【翻译】Dart和Flutter是什么?

    Dart是在Go之后从谷歌出现的 最近作为Flutter跨平台前端框架背后的语言 其受欢迎程度激增 这对那些对云原生基础设施感兴趣的人来说很重要 因为有一种对 全栈Dart 的推动 Flutter开发者可以使用相同的语言来构建他们应用程序背
  • 【翻译】#拥抱行动和心理安全--思考根本原因而非根本人物

    本杰明 富兰克林曾经说过 生命中唯一的两个确定性是死亡和税收 但是 如果他是一名工程师 他可能会在这个名单上加上另一个 即故障 脸书的工程师们无疑会同意最近的故障 似乎是由于运行一个命令 无意中关闭了他们骨干网络的所有连接 不仅关闭了脸书
  • Qt多国语言动态切换(含源代码)

    Qt中文国际化 含高阶做法 作者 melon 日期 2019 7 15 1 国际化需要用到的工具 lrelease exe lupdate exe linguist exe 非必须 这些工具在Qt5 12 2的bin文件夹都可以找到 lup

随机推荐

  • Windows服务器管理(运维)——cmd命令大全

    1 文件和目录操作命令 cd 更改当前目录 dir 列出当前目录中的文件和文件夹 mkdir 创建一个新的文件夹 rmdir 删除一个空的文件夹 copy 复制文件或文件夹 del 删除文件 ren 重命名文件或文件夹 move 移动文件或
  • angular html原理,Angular 4.x ngModel 双向绑定原理揭秘

    在 Angular 4 x 中对于使用 Template Driven 表单场景 如果需要实现表单数据绑定 我们就需要引入 ngModel 指令 该指令用于基于 domain 模型 创建 FormControl 实例 并将创建的实例绑定到表
  • java日志级别

    java中日志级别有7 个级别 severe Warning info config fine finer finest 默认情况只记录前三个级别 另外可以使用Level ALL开启所有的级别记录 或者使用Level OFF关闭所有的级别记
  • android动静态申请IMEI或其他特殊权限(适配11)

    报错原因 今天又是撸代码的一天 人生第一个项目上架闪退被打回 很难受 打开就闪退 后面才恍然大悟 打开APP默认申请获取手机IMEI 测试用的手机被我手动打开了权限 所以一直没有注意这个问题 果然 log报错 java lang Secur
  • pjsip的一个qt写的demo

    msvc版本编译的pjsip的demo 有源码 也有可直接运行的包 本程序解决了pjsip双方互相同时呼叫时会出现的问题 目前只是用来呼叫接听的demo 没有做流媒体传输 https download csdn net download q
  • 【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

    我们在学习结构体之后 就可以尝试去实现通讯录的制作 如果您这边对于结构体还没有太多的认识的话 请先访问这一篇文章 会有利于接下来的学习 自定义类型 带你走进结构体 枚举 联合 小王学代码的博客 CSDN博客 目录 一 通讯录 二 静态通讯录
  • Java自增和自减运算符(++和--)

    在对一个变量做加 1 或减 1 处理时 可以使用自增运算符 或自减运算 或 是单目运算符 放在操作数的前面或后面都是允许的 与 的作用是使变量的值增 1 或减 1 操作数必须是一个整型或浮点型变量 自增 自减运算的含义及其使用实例如表 1
  • Flutter实现倒计时功能,秒数转时分秒,然后倒计时

    Flutter实现倒计时功能 发布时间 2023 05 12 本文实例为大家分享了Flutter实现倒计时功能的具体代码 供大家参考 具体内容如下 有一个需求 需要在页面进行显示倒计时 倒计时结束后 做相应的逻辑处理 实现思路 在Flutt
  • 牛客中等难度3

    HJ70 矩阵乘法计算量估算 描述 矩阵乘法的运算量与矩阵乘法的顺序强相关 例如 A是一个50 10的矩阵 B是10 20的矩阵 C是20 5的矩阵 计算A B C有两种顺序 AB C 或者 A BC 前者需要计算15000次乘法 后者只需
  • 异常处理包装技术

    异常大致可分为两种 受检查异常和非受检查异常 受检查异常是在编译期间就可以检查到的 非受检查异常又分为error和RuntimeException 非受检查异常是可控的 可以人为操作修改的 一般我们针对业务异常 非受检查异常 进行处理 会继
  • 鸿蒙系统是否可以用来做服务器,小米手机也能使用鸿蒙系统?国内厂商使用鸿蒙热情高涨...

    原标题 小米手机也能使用鸿蒙系统 国内厂商使用鸿蒙热情高涨 自从6月2日HarmonyOS 2正式发布以来 国内针对鸿蒙系统的热议一直不减 对于新买的华为手机用户来说 能第一批次使用上国产的手机系统 也确实过了一把瘾 本次手机系统更新 华为
  • Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备 如果你还没阅读过 建议先看看上一篇文章Android蓝牙开发教程 二 连接蓝牙设备 在上一篇文章中 无论是自动连接还是被动连接 连接成功后 都是将获取到的BluetoothSocket交由连接
  • 根据眼动数据的模板作为KNN聚类的中心点并因此进行数据分类

    from scipy io import loadmat import numpy as np import matplotlib pyplot as plt 实验数据采集分为两个过程 第一个是眼动校准阶段 要求实验参与者依次观看界面上的数
  • VMWare 6.5.3 绿色精简版汉化 +VMware Workstation 6.5.3 Build 185404 汉化绿色精简版

    绿色精简版 参考网上6 5 X几个绿色精简版更新制作 bat不加密 不加入个人信息 喜欢研究的随便看 精简版一般使用够用了 高手估计会觉得缺少某些功能了 那就只能装完整版了 bridge 桥接 usb服务 host only都可以使用 VM
  • C++23新特性个人总结

    文章目录 1 关键字 1 1 consteval 1 2 auto 1 2 1 新增支持数组指针的引用类型 1 2 2 代替decay copy语义 1 3 volatile 1 4 constexpr 1 5 char8 t 1 6 wc
  • 【自动化风控建模系列1】最简洁的代码实现特征初步筛选

    金融信贷开发评分卡时 通常会准备好特征中间层供评分卡开发筛选使用 评分卡的特征选择余地越大 后期越是有可能开发出性能更高的评分卡 但特征变量的选择在此时就成为第一个问题 如何初步筛选出合适的变量 基于经验 我认为第一步的筛选只需要剔除那些极
  • Educoder---Java面向对象 - 集合框架(1)

    第一题 请仔细阅读右侧代码 根据方法内的提示 在Begin End区域内进行代码补充 创建ArrayList集合并且向集合中添加数据 具体要求如下 添加字符串类型数据 https www educoder net 添加double类型数据
  • 偏移注入payload构造技巧实战+Access注入

    url http 218 245 4 113 8888 web03 ca55022fa7ae5c29d179041883fe1556 index asp id 886 拿到url 虽然知道肯定是id是注入点 但还是写一下完整思路 1 拿到界
  • node环境实现console输出不同颜色

    一 输出规则分析 1 输出及打印如下 console log x1B 31m s x1B 0m 这是红色 console log x1B 36m s x1B 0m 这是青色 2 规则说明 x1B 31m 是一个转义序列 它将被您的终端拦截并
  • 【翻译】Dart和Flutter是什么?

    Dart是在Go之后从谷歌出现的 最近作为Flutter跨平台前端框架背后的语言 其受欢迎程度激增 这对那些对云原生基础设施感兴趣的人来说很重要 因为有一种对 全栈Dart 的推动 Flutter开发者可以使用相同的语言来构建他们应用程序背