Flutter學習之旅(四)----Flutter開發語言Dart的基礎語法

Dart官網鎮樓(英文版)

先從一段簡單的Dart代碼入手。

// 定義一個方法
printNumber(num aNumber) {//參數類型爲num,
  print('The number is $aNumber.'); // 打印信息到控制檯,$aNumber等價於${aNumber},表示取aNumber變量的值。
}
// APP運行入口
main() {
  var number = 42; //定義並初始化變量,var表示沒有給變量制定類型
  printNumber(number); // 調用方法
}

如果把Dart語言開發比喻成玩遊戲,那麼我們必須遵守它的遊戲規則,Dart語言有下面這些規則:

*給變量賦值時,只能把對象賦值給變量,每一個對象都是類的實例。而且,數字,方法和null值都是對象,所有的對象繼承自Object類。
*聲明變量的時候指定具體類型(像num aNumber這樣指定類型爲num)可以清晰的表明你的意圖,並且可以被工具靜態檢測,不過你也可以不指定。如果你沒有爲變量指定具體類型的話,那麼你在調試程序的時候會看到該變量爲特殊的類型dynamic
*Dart會在運行前對所有的代碼進行語法分析。
*Dart支持頂層方法(比如說main()方法),同時支持類級別或對象級別的方法,你還可以在方法內部新建方法(嵌套方法或本地方法)。
*同樣,Dart支持頂層變量,同時支持類級別或對象級別的變量,實例變量有時候被稱爲域或者屬性。
*與Java不同的是,Dart沒有關鍵詞public,protected和private,不過可以用下劃線(_)表示private。
*標識符(變量名或方法名等)可以以字母或下劃線_開頭,
*Dart工具能報告兩類問題:告警warning和錯誤error。Warning僅僅暗示代碼可能無法正常工作,但是程序還能運行。Error可能出現在編譯時或運行時,而編譯時出現錯誤後程序就無法運行,運行時錯誤就會出現異常。
*任何變量的初始值爲null,即使num類型的初始值也是null,因爲它也是對象。

Dart的七種數據類型
1.numbers
2.strings
3.booleans
4.lists (即arrays)
5.maps
6.runes (用字符串表示Unicode characters)
7.symbols
1.numbers包括int(範圍爲-2^53到2^53)和double,num類型操作符請查看dart:math

//將string類型轉換爲number類型:
var one=int.parse('1');
//將int類型轉換爲string類型
String oneAsString = 1.toString();

2.Dart中的string是UTF-16編碼單元的序列,可用單引號或雙引號括起來。

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
//字符串拼接的兩種情況
var s1 = '這是 ' '字符串' " 拼接";
var s2 = '這是字符串 '+ '拼接';
//多行字符
var s1 = '''
這裏是
多行
字符
''';

3.booleans
在Dart中,只有true值被認爲是true,其他所有的值都被認爲是false,所以像值1,”aString”等等都被認爲是false,這點與JavaScript不同。
4.lists (即arrays)
以後單獨講解。
5.Maps

//map賦值的第一種方式
var myMap1={"one":"1","two":"2"};
var myMap2={1:"1",2:"2"};
//map賦值的第二種方式
var myMap3=new Map();
myMap3["one"]="1";

6.Runes(是字符串的UTF-32編碼格式)

main() {
  var clapping = '\u{1f44f}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());
  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}

把上面代碼複製到DartPad,點擊Run,運行結果:
這裏寫圖片描述

7.Functions
Dart是真正面向對象的語言,甚至方法也是對象,類型爲Function,這意味着方法也能作爲參數傳遞給另外一個方法。

可選參數

String say(String s1,[String s2]){//調用時可以只傳第一個參數,也可以傳兩個參數
    if(s2!=null)print(s1+s2);
}
//調用:
say('s1');
say('s1','s2');

條件表達式
condition ? expr1 : expr2
假如condition爲 true, 返回 expr1 否則返回 expr2.
expr1 ?? expr2
假如expr1 爲 non-null, 返回expr1,否則返回expr2.

串聯符號..

querySelector('#button') // Get an object.
  ..text = 'Confirm'   // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

等價於

var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

語法糖

class Point {
  num x;
  num y;
  // 設置x和y的語法糖
  Point(this.x, this.y);
}

給指定的包加前綴
假如導入的兩個包有衝突的地方,比如library1 和library2 都有Element類,如下

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
Element element1 = new Element();           // 使用lib1的 Element 
lib2.Element element2 = new lib2.Element(); // 使用lib2的 Element

假如你只需要導入包的部分內容,可如下操作:

// 只導入foo.
import 'package:lib1/lib1.dart' show foo;
// 不導入foo.
import 'package:lib2/lib2.dart' hide foo;

懶加載導包
懶加載是指只在需要的時候導入包,下面三種情況可能使用到懶加載:
*減少APP初始化啓動時間。
*執行A/B測試,比如說切換算法的實現。
*導入很少使用的包。
使用 deferred as來指定懶加載,具體使用如下:

import 'package:deferred/hello.dart' deferred as hello;

當你需要加載包的時候,調用loadLibrary()方法:

greet() async {
  await hello.loadLibrary();//await(必須放在async方法裏面)表示等待執行完再執行下面代碼,hello.loadLibrary調用一次,該包只加載一次,需要多處加載,則多次調用。
  hello.printGreeting();
}

除此之外,像if-else,for()循環,while循環,switch-case,try-catch等知識與Java裏面類似,就沒有列出來。本文內容可以作爲Dart語法基本瞭解,更深層次的內容後面還會介紹。如果看完這篇文章您有所收穫,不忘點個贊或者留言,您的鼓勵是我前進的動力,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章