Dart 是由 Google 主导开发,于2011年10月公开;它的开发团队由 Google Chrome 浏览器 V8 引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化 Web 开发语言
Dart 也是一种面向对象语言,但是它采用基于类编程;Dart 的设计目标应该是既对标 Java,也对标 JavaScript,Dart 在静态语法方面和 Java 非常相似,如类型定义、函数声明、泛型等,而在动态特性方面又和 JavaScript 很像,如函数式特性、异步支持等,因此 Flutter 便成为了跨平台行业一个热点
想要学习开发 Flutter 首先就要先了解 Dart 语言的基本概念
Dart 是面向对象的语言,和许多面向对象语言有着很接近的语法,如果你学过 C++,C#,Java 那么你只需要很短的时间就可以掌握 Dart,并且 Dart 语言具有以下几个特点:
一个简单的Dart程序大概长这个样子:
// 定义函数printInteger(int aNumber) { print('The number is $aNumber.'); // 打印输出}// 应用执行入口main() { var number = 42; // 声明和初始化变量 printInteger(number); // 调用函数}
如果你要深入学习 Dart 请谨记以下这些核心概念:
/// Returns a Boolean representation for [arg], which must/// be a String or bool.bool convertToBool(dynamic arg) { if (arg is bool) return arg; if (arg is String) return arg == 'true'; throw ArgumentError('Cannot convert $arg to a bool.');}
我们可以把 Dart 中的类可分为两大类: 泛型类和非泛型类
我们可能会经常在 Flutter 开发中遇到 subtype 子类型的错误: type 'String' is not a subtype of type 'num' of 'other'. 到底啥是子类型呢? 它和子类是一个概念吗?
首先给出一个数学归纳公式:
我们一般说子类就是派生类,该类一般会继承它的父类(也叫基类);例如: class Student extends Person{//...},这里的 Student 一般称为 Person 的子类
而子类型则不一样,我们从上面就知道一个类可以有很多类型,那么子类型不仅仅是想子类那样继承关系那么严格
子类型定义的规则一般是这样的: 任何时候如果需要的是 A 类型值的任何地方,都可以使用 B 类型的值来替换的,那么就可以说 B 类型是 A 类型的子类型或者称 A 类型是 B 类型的超类型
在 Dart 中的类型实际上是可选的,也就是在 Dart 中函数类型,参数类型,变量类型是可以直接省略的
sum(a, b, c, d) {//函数参数类型和返回值类型可以省略 return a + b + c + d;}main() { print('${sum(10, 12, 14, 12)}');//正常运行}
上述的 sum 函数既没有返回值类型也没有参数类型,可能有的人会疑惑如果 sum 函数最后一个形参传入一个 String 类型会是怎么样
答案是: 静态类型检查分析正常但是编译运行异常
sum(a, b, c, d) { return a + b + c + d;}main() { print('${sum(10, 12, 14, "12312")}');//静态检查类型检查正常,运行异常}//运行结果Unhandled exception:type 'String' is not a subtype of type 'num' of 'other' //请先记住这个子类型不匹配异常问题,因为在后面会详细分析子类型的含义,而且Dart、Flutter开发中会经常看到这个异常。Process finished with exit code 255
虽然,可选类型从一方面使得整个代码变得简洁以及具有动态性,但是从另一方面它会使得静态检查类型难以分析
但是这也使得 dart 中失去了基于类型函数重载特性;我们都知道函数重载是静态语言中比较常见的语法特性,可是在 dart 中是不支持的
比如在其他语言我们一般使用构造器重载解决多种方式构造对象的场景,但是 dart 不支持构造器重载,所以为了解决这个问题,Dart 推出了命名构造器的概念;那可选类型语法特性为什么会和函数重载特性冲突呢?
我们可以使用反证法,假设 dart 支持函数重载,那么可能就会有以下这段代码:
class IllegalCode { overloaded(num data) { } overloaded(List data){//假设支持函数重载,实际上这是非法的 }}main() { var data1 = 100; var data2 = ["100"]; //由于dart中的类型是可选的,以下函数调用,根本就无法分辨下面代码实际上调用哪个overloaded函数。 overloaded(data1); overloaded(data2);}
如果仅从可选类型角度去考虑的话,实际上 dart 现在是可以支持基于类型的函数重载的,因为 Dart 有类型推导功能;如果 dart 能够推导出上述 data1 和 data2 类型,那么就可以根据推导出的类型去匹配重载的函数
实际上,Dart 官方在 Github 提到过 Dart 迁移到新的类型系统中,Dart 是有能力支持函数重载的
我们喜欢 Flutter 的一点是,它不仅仅是谷歌的产品--它是一个 "所有人 "的产品;开源意味着我们都可以参与其中,并与它的成功息息相关,无论是通过贡献新的代码或文档,创建赋予核心框架新的超能力的包,编写教导他人的书籍和培训课程,还是帮助组织活动和用户组
为了展示 Flutter 社区的最佳状态,我们最近与 DevPost 合作赞助了一个Puzzle Hack 挑战,为开发者提供了一个机会,通过用 Flutter 重新想象经典的滑动拼图来展示他们的技能;这证明了网络、桌面和移动的完美结合;现在我们都可以在线或通过商店玩这些游戏
今天我们对 Flutter Dart 语言的概述就到这里了,有需要了解更多关于 Flutter 的相关资讯;可以私信发送 "进阶" ,即可获取一份 Fultter 开源学习手册,以便大家能够更好的学习 Fultter
内容展示如下:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
最后祝各位开发者早日精通 Flutter ,攀登上更高的高峰