Flutter体验 Day 3-Dart CheatSheet (1)

Dart CheatSheet (1)

虽然不一定要掌握 Dart 才可以开始 Flutter 的开发工作,不过至少要理解基础的语法结构以及语言的特性。

Dart入门

Dart程序语言是一款由 goolge 主导开发,於2011年10月公开,当初的目标是发展成为下一代的 Web 开发语言,不过 Javascript 当时已被各浏览器所支持又遇到 nodejs 使用前端应用框架的兴起,初期并没有获得较多开发人员的青睐,不过在这段时间里 dart 慢慢从当初浏览器的范畴跨足到移动开发的领域,并且吸收许多不同程序语言的优点,转变成一个效能高且更加安全的强型别程序语言,因此在学习dart的过程中,我们发现许多目前主流程序语言相类似语法(Java、TypeScrip…)。

对於有一定经验的 "程序猿" 来说,学习Dart应该不是太大的难度。可拜读官网上的技术文件

重要概念

  • Dart 中每个变数参照的都是 Object,每个 Object 都是一个 Class 的 instance,除了 null 之外,所有的 Class 都是继承自 Object。

  • 与 JavaScript 这种弱型别相比,Dart 是强型别的的程序语言。

  • 对於 JavaScript 是动态类型的语言,而 Dart 则是静态类型语言。

所谓的动态类型指的是在运行期间才去检查型别检查的语系,而静态语言则是在编译阶段进行检查。

  • Dart 预设为 null-safety 原则,也就是说变数在宣告时预设不得为空(null),除非你明确声明此变数可为空。
int? aNullableInt;
  • Dart 支持泛型,这是一种在强型别语系上常见的编码风格。

  • 与 Java 相比较,Dart 没有类似 publicprotectedprivate 存取权限的修饰符,在变数名称命名上若以下底线(_)开头的即表现该变数为私有,是不是很像 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;

Dart CheatSheet

每款程序语言都有其特色的语法,google工程师们已帮我们整理出 dart-cheatsheet,内容如下:

字符串的插值 (String interpolation)

类似 es6 的字串样版语法,有变数表达式两种写法可以使用

  // 变数
  var activity = "铁人赛";
  print("我参加了$activity"); // 我参加了铁人赛

  // 表达式:内含运算子的一段程序
  // + - * / ~/ %
  var num = 29;
  print("这需要连续挑战${num + 1}天"); // 这需要连续挑战30天

可为空的变数 (Nullable variables)

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;

预防为空的运算子 (Null-aware operators)

可以使用??检查左侧的代码是否为空

  int? aNumOfnulll;
  aNumOfnulll ??= 1;
  print(aNumOfnulll); // 1

集合字面值 (Collection literals)

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)

虽然 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
}

课程练习

官方速查表中可以练习的题目,请试着解答这些问题

小结

练习成果


<<:  【Day 11】Python os.path模组

>>:  [Day11] Flutter - StatelessWidget & StatfulWidget 差别

数据和系统所有者(Data and System Owners)

如果未识别数据,则无法分配数据所有者。仅在识别,定位并清点数据之後才分配数据所有者。此外,在整个组织...

Day 14 讯息伫列

之前,我们都在讨论排程、号志的观念,在有效的排程之後,就能让任务很顺利的运作,达到一个有效的即时系统...

人脸辨识的流程--人脸侦测

在上一章讲到人脸辨识系统有三个步骤,人脸侦测、特徵撷取、人脸识别。 在人脸侦测部分常见的有Haar-...

[火锅吃到饱-7] 大喜锅 - 南屯店 - 平日午餐250元吃到饱 | 学生&小资族首选

又是忙到下午4点才吃第一餐的一天~ 赶在下午4点半之前进场都算午餐价,费用是250元(不收服务费),...

Day 01 Flask 是什麽

根据 程序语言社群 TIOBE 2021年8月发表的热门程序语言排行榜中,Python 在众多程序语...