虽然不一定要掌握 Dart 才可以开始 Flutter 的开发工作,不过至少要理解基础的语法结构以及语言的特性。
Dart程序语言是一款由 goolge 主导开发,於2011年10月公开,当初的目标是发展成为下一代的 Web 开发语言,不过 Javascript 当时已被各浏览器所支持又遇到 nodejs 使用前端应用框架的兴起,初期并没有获得较多开发人员的青睐,不过在这段时间里 dart 慢慢从当初浏览器的范畴跨足到移动开发的领域,并且吸收许多不同程序语言的优点,转变成一个效能高且更加安全的强型别程序语言,因此在学习dart的过程中,我们发现许多目前主流程序语言相类似语法(Java、TypeScrip…)。
对於有一定经验的 "程序猿" 来说,学习Dart应该不是太大的难度。可拜读官网上的技术文件。
Dart 中每个变数参照的都是 Object,每个 Object 都是一个 Class 的 instance,除了 null 之外,所有的 Class 都是继承自 Object。
与 JavaScript 这种弱型别相比,Dart 是强型别的的程序语言。
对於 JavaScript 是动态类型的语言,而 Dart 则是静态类型语言。
所谓的动态类型指的是在运行期间才去检查型别检查的语系,而静态语言则是在编译阶段进行检查。
null-safety
原则,也就是说变数在宣告时预设不得为空(null),除非你明确声明此变数可为空。int? aNullableInt;
Dart 支持泛型,这是一种在强型别语系上常见的编码风格。
与 Java 相比较,Dart 没有类似 public
、protected
、private
存取权限的修饰符,在变数名称命名上若以下底线(_)开头的即表现该变数为私有,是不是很像 JS 的风格。
类似Java应用程序,运行程序的入口为 main() 函数
void main() {
print("hello world");
}
在 termianl 可以使用 dart
指令可以执行程序内容
❯ dart hello.dart
hello world
dart 可以透过值推论出该值的型别为何,因此可以使用 var
+ 变数名称 完成变数的宣告,下面是在开发时常见的基础型别:
//String
var aString = "I am a String";
print(aString.runtimeType); // String
// Numbers
var aInterger = 1;
print(aInterger.runtimeType); // int
var aDobule = 0.1;
print(aDobule.runtimeType); // dobule
// Booleans
var aTrue = true;
print(aTrue.runtimeType); // bool
// Lists or Array
var aList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
print(aList.runtimeType); // List<int>
// Maps
var aMap = {"type": "Mobile Development", "title": "flutter"};
print(aMap.runtimeType); // _InternalLinkedHashMap<String, String>
// Sets
var aSet = {"a", "b", "c", "d", "e"};
print(aSet.runtimeType); // _CompactLinkedHashSet<String>
// Null
var aNull = null;
print(aNull.runtimeType); // Null
// Runes
var emoji = "?";
print(emoji.runes.runtimeType); // Runes
// Symbols
var aSymbol = Symbol("ithome");
print(aSymbol); // Symbol("ithome")
另外也可以在变数名称前明确宣告变数的型别
int num = 1;
每款程序语言都有其特色的语法,google工程师们已帮我们整理出 dart-cheatsheet,内容如下:
类似 es6 的字串样版语法,有变数
或表达式
两种写法可以使用
// 变数
var activity = "铁人赛";
print("我参加了$activity"); // 我参加了铁人赛
// 表达式:内含运算子的一段程序
// + - * / ~/ %
var num = 29;
print("这需要连续挑战${num + 1}天"); // 这需要连续挑战30天
Dart为了更完善的健全null-safe
,变数预设上不可为空
int aIntOfNull = null;
系统将会提示以下讯息
A value of type 'Null' can't be assigned to a variable of type 'int'.
Try changing the type of the variable, or casting the right-hand type to 'int'.dart(invalid_assignment)
若需要使用 null 时,需要使用(?)明确的宣告
int? aIntOfNull;
可以使用??
检查左侧的代码是否为空
int? aNumOfnulll;
aNumOfnulll ??= 1;
print(aNumOfnulll); // 1
Dart 提供三种类型的集合字面值设定,分别为 List、Set、Map
var aList = ["a", "b", "c", "d"];
print(aList); // [a, b, c, d]
var aSet = {"a", "b", "c", "d"};
print(aSet); // {a, b, c, d}
var aMap = {"a": "a", "b": "b", "c": "c", "d": "d"};
print(aMap); // {a: a, b: b, c: c, d: d}
有点类似 JS 的箭头语法,主要用来进行单行函式简写使用。
import 'dart:math' as math;
void main() {
var aListOfNum = [1, 2, 3, 4];
var aListOfNumByPow = aListOfNum.map((num) => math.pow(num, 2)).toList();
print(aListOfNumByPow); // [1, 4, 9, 16]
}
虽然 Cascades 在 dart.cn 上翻译为"级连",不过我从国家教育研究院上的词汇查询得到学术名词感觉"串级"会比较贴切一些。
这个在 JS 上为了在实体化物件後可以达到函式链结的行为,我们大都会在函式中将this
当作回传值传出,以方便链式的呼叫该实例的方法。我分别使用 JS 以及 Dart 写了一个日期时间的类别,比较串级在不同程序语言上的实作方式。
/// NOTE:这边是js的语法
class DateTime {
_date = null;
constructor() {
this._date = new Date();
}
add(num, type) {
switch (type) {
case 'days':
this._addDays(num);
break;
default:
}
return this;
}
setDate(newDate) {
this._date = newDate;
}
_addDays(num) {
this._date.setDate(this._date.getDate() + num);
return this;
}
toString() {
return this._date.toString();
}
}
const date = new DateTime();
// 函式链结
const result =
date
.setDate(new Date(2021, 8, 2, 0, 0, 0))
.add(30, 'days')
.toString();
console.log(result); // Sat Oct 02 2021 00:00:00 GMT+0800 (台北标准时间)
Dart 中如果要对同一对象执行函式链结的操作,只需要使用串级的语法即可,比较上下两段程序码可以发现 Dart 在程序上的行数明显少了许多。
class MyDateTime {
DateTime _date;
MyDateTime() : _date = DateTime.now();
add(int num, String type) {
switch (type) {
case 'days':
_addDays(num);
break;
default:
}
}
setDate(DateTime date) {
_date = date;
return _date; // 使用(.)与(..)取得的内容会不一样
}
_addDays(int num) {
_date = _date.add(Duration(days: num));
}
toString() {
return _date.toString();
}
}
void main() {
var date = MyDateTime();
var result = date
..setDate(DateTime(2021, 8, 2))
..add(30, 'days')
..toString();
print(result); // 2021-09-01 00:00:00.000
var dateTime = MyDateTime().setDate(DateTime(2021, 8, 2));
print(dateTime.runtimeType); // DateTime
var myDateTime = MyDateTime()..setDate(DateTime(2021, 8, 2));
print(myDateTime.runtimeType); // MyDateTime
}
官方速查表中可以练习的题目,请试着解答这些问题。
>>: [Day11] Flutter - StatelessWidget & StatfulWidget 差别
如果未识别数据,则无法分配数据所有者。仅在识别,定位并清点数据之後才分配数据所有者。此外,在整个组织...
之前,我们都在讨论排程、号志的观念,在有效的排程之後,就能让任务很顺利的运作,达到一个有效的即时系统...
在上一章讲到人脸辨识系统有三个步骤,人脸侦测、特徵撷取、人脸识别。 在人脸侦测部分常见的有Haar-...
又是忙到下午4点才吃第一餐的一天~ 赶在下午4点半之前进场都算午餐价,费用是250元(不收服务费),...
根据 程序语言社群 TIOBE 2021年8月发表的热门程序语言排行榜中,Python 在众多程序语...