天天看點

Flutter 系列之Dart語言概述

Dart語言與其他語言究竟有什麼不同呢?在已有的程式設計語言經驗的基礎上,我們該如何快速上手呢?本篇文章從程式設計語言中最重要的組成部分,也就是基礎文法與類型變量出發,一起來學習Dart吧

一、Dart語言之初體驗

Dart可以在編譯器(Android Studio)、指令行(前提是安裝了Dart SDK)及網頁repl.it中調試編譯,由于本次内容比較簡單,我們直接在網頁中調試編譯即可。

我們定義一個輸出目前時間的函數,并輸出目前時間

//輸出目前時間

void nowTime() {
  int year = DateTime.now().year;
  int month = DateTime.now().month;
  int day = DateTime.now().day;
  int hour = DateTime.now().hour;
  int minute = DateTime.now().minute;
  int second = DateTime.now().second;
  String str = 'Hello World, This is $year-$month-$day $hour:$minute:$second';
  print(str);
}
           

和絕大多數其他語言一樣,Dart要求以main函數作為執行的入口,我們再定義main函數,并将輸出當時時間的函數放入main函數中

void main() {
	nowTime();
}
           

點選“run”按鈕,指令就會輸出

Hello World, This is 2019-8-11 10:45:46
           

我們已經可以簡單的運作Dart代碼了,我們接下來再看一下Dart的基本變量類型

二、Dart的變量與類型

在Dart中,所有的變量都可以用var來申明,當然,也可以指定具體的類型來申明一個變量。當使用var申明變量時,表示類型是交由編譯器推斷決定的。雖然Dart支援用var來申明變量,但我還是建議使用具體的類型來申明變量,這樣編輯器和編譯器就能使用這些具體的類型,向你提供代碼補全或編譯告警的提示了。

注意:在預設情況下,所有未初始化的變量值都是null,是以,我們判斷變量是否初始化時隻用和null比較即可。

Dart是類型安全的語言,并且所有類型都是對象類型,都繼承自頂層類型Object,是以一切變量的值都是累的執行個體(即對象),其中包括數字、布爾值、函數和null也都是繼承自Object對象。

Dart内置了一些基本類型,如num、bool、String、List及Map。

num、bool及String

num、bool及String基本上是程式設計語言中最常用的類型

Dart的數值類型num隻有兩種子類:int(整數類型)和double(浮點類型)

void numVerb() {
  int x = 100;
  double y = 5.2;
  double xy=x*y;
  int roundY = xy.round();
  print('x = $x, y = $y, xy = $xy, roundY = $roundY');
}
           
x = 100, y = 5.2, xy = 520.0, roundY = 520
           

除了常見的基本運算符(比如:+、-、*、/,以及位運算符)外,還能使用繼承自num的abs()、round()等方法來實作求絕對值、取整等功能。

Dart的布爾類型bool也隻有兩種取值:true和false,他們都是編譯時常量。 Dart是類型安全的,是以我們需要顯示的檢查值

void checkValue() {
  bool isTrue = true;
  assert(isTrue == true);
  //assert(isTrue);//錯誤
}
           

Dart的String由UTF-16de字元串組成,定義字元串時我們既能使用單引号也能使用雙引号,并且還能在字元串中嵌入變量或表達式(可以使用${express}把一個表達式的值放進字元串,而如果是一個辨別符,則可以省略{})。

/**
 * 将一個字元串中的字母全部轉換為大寫
 */
void upperCase() {
  String str = 'toUpperCase';
  String str2 = "toUpperCase";
  String str3 = 'str = $str, str2 = $str2, str to upperCase: ${str.toUpperCase()}';
  print(str3);
}
           
str = toUpperCase, str2 = toUpperCase, str to upperCase: TOUPPERCASE
           

為了獲得内嵌對象的字元串,Dart會調用對象的toString()方法,而常見字元串的拼接,Dart則通過内置運算符“+”實作。

void stringVerb() {
  int year = DateTime.now().year;
  int month = DateTime.now().month;
  int day = DateTime.now().day;
  int hour = DateTime.now().hour;
  int minute = DateTime.now().minute;
  int second = DateTime.now().second;
  String str = 'Hello World, This is ' +
      year.toString() +
      '-' +
      month.toString() +
      '-' +
      day.toString() +
      ' ' +
      hour.toString() +
      ':' +
      minute.toString() +
      ':' +
      second.toString();
  print(str);
}
           
Hello World, This is 2019-8-11 12:19:31
           

對于多行字元串對的建構,你可以通過三個單引号或三個雙引号的方式申明

void stringVerb() {
  int year = DateTime.now().year;
  int month = DateTime.now().month;
  int day = DateTime.now().day;
  int hour = DateTime.now().hour;
  int minute = DateTime.now().minute;
  int second = DateTime.now().second;
  String str = """Hello World, This is
  $year-$month-$day $hour:$minute:$second""";
  print(str);

  String str2 = '''Hello World, This is
  $year-$month-$day $hour:$minute:$second''';
  print(str2);
}
           
Hello World, This is
      2019-8-11 12:32:5
    Hello World, This is
      2019-8-11 12:32:5
           

List和Map

List和Map分别對應其他程式設計語言中的數組和字典類型,統稱為集合類型

void listTest() {
  List<String> arr1 = ['name', 'age', 'sex'];
  for (var value in arr1) {
    print(value);
  }
  List<int> aar2 = List.of([1, 2, 3]);
  aar2.add(4);
  for (var value2 in aar2) {
    print(value2);
  }
  List<num> nums = new List<num>();
  nums.add(1);
  nums.add(1.1);
  nums.add(3);
  nums.add(5.20);
  for (var value3 in nums) {
    print(value3);
  }
}
           
name
age
sex
1
2
3
4
1
1.1
3
5.2
           

如上代碼所示,我們申明并初始化了三個List變量,并調用其各自的疊代方法依次列印出其内部元素

void mapTest() {
  Map<String, String> map = {'name': 'Jack', 'age': '18', 'sex': '男'};
  map['name'] = 'Tom';
  map['age'] = '20';
  map['sex'] = '男';
  map.forEach((k, v) => print('$k:$v'));

  Map map2=new Map<String,String>();
  map2['name']='Dart';
  map2['age']='2';
  map2.forEach((k,v)=>print('$k:$v'));
}
           
name:Tom
age:20
sex:男
name:Dart
age:2
           

如上代碼所示,我們申明并初始化了兩個Map變量,同樣調用其各自的疊代方法依次列印出其内部的元素

定義常量

如果你想定義不可變的變量,則需要在定義前加上final或const關鍵字 const:表示變量在編譯期間既能确定的值 final:表示變量可以在運作時确定值,但一旦确定後就不可改變 const與final差別:在定義const常量時,必須直接指派,且隻能是一個固定值,不能為一個變量或公式;在定義final常量時,可以指派也可以不指派,指派時可以指派為一個固定值,也可以指派為一個變量或公式,但一旦指派後就不能再改變

已同步更新至微信公衆号,歡迎關注

Flutter 系列之Dart語言概述

繼續閱讀