Flutter準備篇之Dart語言初探

2020-09-24 JAVA油膩男



什麼是Dart

Dart 是一種跨平臺的客戶端開發語言。具有專門為客戶端優化、高生產力、快速高效、可移植易學的風格。Dart主要由Google負責開發和維護

重要概念

  • 在 Dart 中 甚至連 數字、方法和 null 都是對象。所有的對象都繼承於 Object 類
  • Object所有Dart對象的基類,所以每個其他Dart類都是Object的子類,Object在編譯時檢查類型
  • 雖然dart語言通過var進行運行時類型推導,但是Dart是強類型的語言,類型一旦確定就不可以改變
  • Dart 沒有 public、 protected、 和 private 關鍵字。如果一個標識符以 (_) 開頭,則該標識符 在庫內是私有的
  • Dart 工具可以指出兩種問題:警告和錯誤。 警告只是說你的代碼可能有問題, 但是並不會阻止你的代碼執行。 錯誤可以是編譯時錯誤也可以是運行時錯誤。遇到編譯時錯誤時,代碼將 無法執行;運行時錯誤將會在運行代碼的時候導致一個異常

基本語法

Dart內置的數據類型

Dart支持的內置類型有numbers、 strings、booleans、lists、maps

  • numbers 數值

num有兩個子類, int 和 double int值: 其取值通常位於 -253 和 253 之間 double : 64-bit (雙精度) 浮點數,符合 IEEE 754 標準

  • strings 字符串

Dart 字符串是 UTF-16 編碼的字符序列。 可以使用單引號、雙引號、三引號來創建字符串

String string0 = &34;; String string1 = &39;; String string2 = &39;&39;&39;; print(string0); print(string1); print(string2); print(string0==string1); print(string0==&34;);

注意: 1、== 操作符判斷兩個對象的內容是否一樣。 如果兩個字符串包含一樣的字符編碼序列, 則他們是相等的 2、可以使用 + 操作符來把多個字符串連結為一個,也可以把多個 字符串放到一起來實現同樣的功能

num 與string之間相互轉換

// String 轉 int var one = int.parse(&39;); assert(one == 1); // String 轉 double var onePointOne = double.parse(&39;); assert(onePointOne == 1.1); // int 轉 String String oneAsString = 1.toString(); assert(oneAsString == &39;); // double 轉 String String piAsString = 3.14159.toStringAsFixed(2); assert(piAsString == &39;);

  • booleans 布爾值

Dart 有一個名字為 bool 的類型,只有兩個對象是布爾類型的:true 和 false 所創建的對象, 這兩個對象也都是編譯時常量。 當 Dart 需要一個布爾值的時候,只有 true 對象才被認為是 true。 所有其他的值都是 flase。

  • lists 集合、列表

程式語言中最常見的集合類型。 在 Dart 中數組就是 List 對象。所以 通常我們都稱之為 lists

Lists 的下標索引從 0 開始,第一個元素的索引是 0,list.length - 1 是最後一個元素的索引。

訪問 list 的長度和元素與 JavaScript 中的用法一樣 list.asMap()可以將list集合轉為map,list角標作為map的key

Set集合和java差不多,特點就是元素對象不重複

Set set0 = {1, 1, 1, 1, 12, 13, 0}; print(set0); Set set1 = {12, 13, 0, 3, 4}; print(set1); print(set1.difference(set0)); //補集 print(set1.union(set0)); //併集 print(set1.intersection(set0)); //交集

  • maps

Map 是一個鍵值對相關的對象。 鍵和值可以是任何類型的對象。每個 鍵 只出現一次, 而一個值則可以出現多次

關鍵字

標 1 的關鍵字是 內置關鍵字。避免把內置關鍵字當做標識符使用。 也不要把內置關鍵字 用作類名字和類型名字。 有些內置關鍵字是為了方便把 JavaScript 代碼移植到 Dart 而存在的。 例如,如果 JavaScript 代碼中有個變量的名字為 factory, 在移植到 Dart 中的時候,你不必重新命名這個變量。

標 2 的關鍵字,是在 Dart 1.0 發布以後又新加的,用於 支持異步相關的特性。 你不能在標記為 async 或者 sync 的方法體內 使用 async、 await、或者 yield 作為標識符

變量聲明

  • 默認聲明

String str;

沒有初始化的變量自動獲取一個默認值為null,雖然聲明的時string,但是string類型也是一個對象

  • 賦值聲明

String str = &34;;bool isOK

bool isOK; //因為默認都屬null,所以不能直接用在if語句中如 if (isOK) { }

運行報錯: Failed assertion: boolean expression must not be null

  • 常量聲明Final and const

final String string0 = &34;; const String string1 = &34;;

Final and const 修飾的都是常量

final 修飾的常量是運行時常量,運行時只能賦值一次

const 關鍵字不僅僅只用來定義常量。 可以用來創建不變的值, 還能定義構造函數為 const 類型的,這種類型 的構造函數創建的對象是不可改變的。任何變量都可以有一個不變的值

const 修飾的常量為編譯時常量

final List str0 = [&34;, &34;]; final List str1 = [&34;, &34;]; print(identical(str1, str0)); //輸出false //說明str0和str1引用指向不同的對象,也就是說內存中有兩份相同的值 const List str2 = [&34;, &34;]; const List str3 = [&34;, &34;]; print(identical(str2, str3)); //輸出true //說明str2 str3 引用指向同一個內存中的對象

方法聲明

Dart 是一個真正的面向對象語言,方法也是對象並且具有一種 類型, Function。 這意味著,方法可以賦值給變量,也可以當做其他方法的參數。 也可以把 Dart 類的實例當做方法來調用

  • 程序入口main方法

//每個應用都需要有個頂級的 main() 入口方法才能執行//main() 方法的返回值為 void 並且有個可選的 List<String> 參數// 這是程序執行的入口main() { }//下面是一個命令行應用的 main() 方法,並且使用了 方法參數作為輸入參數:void main(List<String> arguments) { print(arguments); assert(arguments.length == 2); assert(int.parse(arguments[0]) == 1); assert(arguments[1] == &39;);}

  • 命名參數方法
    方法可以有兩種類型的參數:必需的和可選的。 必需的參數在參數列表前面, 後面是可選參數

(1)可選命名參數
可選參數可以是命名參數或者基於位置的參數,但是這兩種參數不能同時當做可選參數
定義:使用 {param1, param2, …} 的形式來指定命名參數

hello2({int a, int b}) {print(a);print(b);}

調用:使用這種形式 paramName: value 來指定命名參數

print(hello2(a: 1));//輸出結果1nullnull

(2)可選位置參數
定義:把一些方法的參數放到 [] 中就變成可選位置參數了

hello3(String name, [int age, String str]) {print(name);print(age);print(str);}

調用:

//不使用可選參數調用 print(hello3(&34;)); //使用可選參數調用print(hello3(&34;, 27, &34;));//使用可選參數調用print(hello3(&34;, null, &34;));

可選命名比可選位置更加靈活: 命名可以跳過一些參數,但是可選位置只能順序傳參,想要跳過就傳入null

(3)默認參數
定義:在定義方法的時候,可以使用 = 來定義可選參數的默認值。 默認值只能是編譯時常量。 如果沒有提供默認值,則默認值為 null

void hello3(String name, [int age, String str = &34;]) {print(name);print(age);print(str);}

還可以使用 list 或者 map 作為默認值

  • 匿名方法
    大部分方法都帶有名字,例如 main() 或者 printElement()。 你有可以創建沒有名字的方法,稱之為 匿名方法,有時候也被稱為 lambda 或者 closure 閉包。 你可以把匿名方法賦值給一個變量, 然後你可以使用這個方法,比如添加到集合或者從集合中刪除。

匿名函數和命名函數看起來類似— 在括號之間可以定義一些參數,參數使用逗號 分割,也可以是可選參數。 後面大括號中的代碼為函數體:

([[Type] param1[, …]]) { codeBlock; };

注意:
1、胖箭頭語法
對於只有一個表達式的方法,你可以選擇 使用縮寫語法來定義:

int add(int a, int b) => a + b;//等價與int add(int a, int b) { return a+b;}

在箭頭 (=>) 和冒號 (;) 之間只能使用一個表達式,不能使用語句

2、級聯調用
代碼中的..語法為級聯調用。 使用級聯調用語法, 你可以在一個對象上執行多個操作
3、Dart支持方法中定義方法,並且可以多級嵌套
4、所有的函數都返回一個值。如果沒有指定返回值,則默認把語句 return null; 作為函數的最後一個語句執行

操作符

下表是 Dart 中定義的操作符。 很多操作符都可以重載 在操作符表格中所列的操作符 都是按照優先級順序從左到右,從上到下的方式來列出的, 上面和左邊的操作符優先級要高於下面和右邊的。 例如 % 操作符優先級高於 ==,而 等號 高於 &&

可覆寫的操作符
下表中的操作符可以被覆寫。 例如,如果你定義了一個 Vector 類, 你可以定義一個 + 函數來實現兩個向量相加

如果你覆寫了 == ,則還應該覆寫對象的 hashCode getter 函數

斷言assert

注意: 在生產模式 assert() 語句被忽略了。在檢查模式 assert(*condition*) 會執行 assert 方法的參數可以為任何返回布爾值的表達式或者方法。 如果返回的值為 true, 斷言執行通過,執行結束。 如果返回值為 false, 斷言執行失敗,會拋出一個異常 AssertionError

流程控制

1、for循環

main() { List<String> colorList = [&39;, &39;, &39;, &39;]; for (var i = 0; i < colorList.length; i++) {//可以用var或int print(colorList[i]); }}

2、while循環

main() { List<String> colorList = [&39;, &39;, &39;, &39;]; var index = 0; while (index < colorList.length) { print(colorList[index++]); }}

3、do-while循環

main() { List<String> colorList = [&39;, &39;, &39;, &39;]; var index = 0; do { print(colorList[index++]); } while (index < colorList.length);}

4、break和continue

main() { List<String> colorList = [&39;, &39;, &39;, &39;]; for (var i = 0; i < colorList.length; i++) {//可以用var或int if(colorList[i] == &39;) { continue; } if(colorList[i] == &39;) { break; } print(colorList[i]); }}

5、if-else

void main() { var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; for (var i = 0; i < numbers.length; i++) { if (numbers[i].isEven) { print(&39;); } else if (numbers[i].isOdd) { print(&39;); } else { print(&39;); } }}

6、三目運算符(? : )

void main() { var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; for (var i = 0; i < numbers.length; i++) { num targetNumber = numbers[i].isEven ? numbers[i] * 2 : numbers[i] + 4; print(targetNumber); }}

7、switch-case語句

Color getColor(String colorName) { Color currentColor = Colors.blue; switch (colorName) { case &34;: currentColor = Colors.red; break; case &34;: currentColor = Colors.blue; break; case &34;: currentColor = Colors.yellow; break; } return currentColor;}

異常

dart中的異常捕獲方法和Java,Kotlin類似,使用的也是try-catch-finally; 對特定異常的捕獲使用on關鍵字. dart中的常見異常有: NoSuchMethodError(當在一個對象上調用一個該對象沒有 實現的函數會拋出該錯誤)、ArgumentError (調用函數的參數不合法會拋出這個錯誤)

main() { int num = 18; int result = 0; try { result = num ~/ 0; } catch (e) {//捕獲到IntegerDivisionByZeroException print(e.toString()); } finally { print(&39;); }}//使用on關鍵字捕獲特定的異常main() { int num = 18; int result = 0; try { result = num ~/ 0; } on IntegerDivisionByZeroException catch (e) {//捕獲特定異常 print(e.toString()); } finally { print(&39;); }}

相關焦點

  • 谷歌、阿里都在使用的dart程式語言,你學過沒?
    Dart是谷歌開發的計算機程式語言,它被用於web、伺服器、移動應用 和物聯網等領域的開發。Dart是面向對象的、類定義的、單繼承的語言。5、全新的作業系統fuchsia採用了dart作為UI層的語言,flutter作為框架。在不遠的將來,一定會有所作為!自從Google I / O宣布Flutter以來,Dart作為React Native的替代品已經引起了移動開發人員的極大關注。不喜歡JavaScript作為程式語言的開發人員發現Dart是替代選擇。
  • Google同時啟動Flutter 1.2和Dart 2.2
    Google此次Flutter更新有什麼新內容?dart flutterFlutter 1.2的新功能1.更多的插件Flutter開發人員的官方團隊已添加了許多插件,以使應用程式開發框架更健康。software engineer關於Dart 2.2和Dart DevTools的所有信息儘管有多種Flutter編寫方式,但是使用dart程式語言是最受歡迎的方式之一。
  • 《十天入門Flutter》第五天 Dart剩下的億點點
    和其它程式語言比較相似,這裡簡單地提一下,不重點講庫Dart中的庫主要有三種:我們自定義的庫import 'lib/xxx.dart';系統內置庫import 'dart:math';import 'dart:io';import 'dart:convert';Pub包管理系統中的庫https://pub.dev/packageshttps://pub.flutter-io.cn/packages
  • Flutter技術:Dart語言學習詳解篇
    Flutter總結系列1.Dart語言特點在Dart中,一切都是對象,一切對象都是class的實例,哪怕是數字類型、方法甚至null都是對象,所有的對象都是繼承自Object雖然Dart是強類型語言,但變量類型是可選的因為
  • Flutter中的Tree Shaking機制初探(科普文)
    背景在閒魚技術探究Flutter工程一體化的過程中,為了做到最好的開發體驗,需要無縫銜接FaaS端代碼與業務Flutter代碼,一份代碼既可以在FaaS部署,也可以直接引入在業務代碼主工程中,使之真正做到工程一體。
  • Flutter布局與油畫
    flutter是谷歌力推的一項移動端跨平臺技術,自從推出以來就發展迅速,雖然還達不到撼動React的地位,但是也隱隱然有著「下一代跨平臺王者」的氣質了。flutter相對於React的優勢是很明顯的。相反,flutter是從IOS和Android的硬體層開始實行跨平臺,自底向上開發了一整套前端顯示方案,完美的避免了React的缺陷,性能上輕鬆達到60bps刷新頻率,更是號稱能夠用來做2d遊戲。同時flutter也有一些開發者所不滿的地方。第一點就是,採用dart語言。
  • Flutter框架的安裝與環境配置
    2.開發者可以通過 Dart語言開發 App,一套代碼可同時運行在 iOS 、Android、Mac、Windows等平臺,甚至能生成Web版,運行於瀏覽器中。3.Dart 語法結合Java與JavaScript語法特點,幾乎沒有令人不適的怪異語法,使Java系程式設計師倍感親切,快速上手4.推薦使用Android Studio,flutter,dart,甚至flushia,是Google重新發力打造的新生態工具,所以無論是從編譯、打包,還是後續插件化升級,都有一定的優勢1.2.
  • Flutter文本輸入框TextField的焦點控制
    題記—— 執劍天涯,從你的點滴積累開始,所及之處,必精益求精。源碼如下:///TextField 焦點獲取控制篇class: ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════flutter: The following assertion was thrown while dispatching notifications for FocusNode:flutter:
  • Dart 2.10 發布,帶來新的 Dart 開發者工具
    Flutter 在 Flutter SDK 中已經包含了這個新的 Dart 工具。從 Flutter 1.22 SDK 開始, <flutter-sdk>/bin 同時包含 flutter 和 dart 命令。如果同時進行 Flutter 開發和通用 Dart 開發,則可以通過單個 Flutter SDK 滿足開發需求,而無需安裝其他任何東西。
  • Flutter 1.20穩定版發布 基於Dart程式語言2.9版本構建
    Flutter 1.20 現已發布,該版本基於 Dart 程式語言 2.9 版本構建,包含了諸多的性能改進、多項 UI 增強功能、對 Visual Studio Code 擴展的更新以及針對移動文本欄位的自動填充等內容。
  • Flutter實現國際化
    如果想要添加其他語言,你的應用必須指定額外的 MaterialApp 屬性並且添加一個單獨的 package,叫做 flutter_localizations。截至到 2020 年 2 月份,這個 package 已經支持大約 77 種語言。
  • Flutter 二維碼掃描插件
    : ^1.0.1導入頭文件 import 'package:flutter_plugin_qrcode/flutter_plugin_qrcode.dart';mounted) return; //獲取到掃描的結果進行頁面更新 setState(() { _qrcode = qrcode; }); }example 代碼import 'package:flutter/material.dart';import
  • Flutter 實戰8
    下面對main.dart文件進行簡單的修改。模板生成的_MyHomePageState類是應用程式的首頁面狀態類,其中的build方法用來進行界面的配置,我們將其修改如下圖片最好放在 assets目錄下,靜態文件,方便管理。
  • 最新版本flutter進行web頁面的項目開發
    火爆的flutter技術已經遍地開花了.之所以會好多技術公司用,肯定它有過人之處.感興趣的朋友可以自行查詢.我這裡做的例子演示是利用flutter進行web頁開發而非移動端開發.相對於移動端手機開發,web項目開發少之又少,而且資料也不多.我這裡就好剛剛搭建成功的步驟分享給大家學習.
  • Flutter 初嘗:從 Java 無縫過渡
    準備階段下載 Flutter SDK新建 Flutter 文件夾,克隆 Flutter SDK:git clone -b beta https://github.com/flutter/flutter.git配置 Flutter 環境我是 Mac 系統,Flutter SDK 下載完後的路徑:Users/
  • 零基礎學Flutter之Dart簡介和基本語法
    Dart介紹Dart是谷歌開發的計算機程式語言,它被用於web、伺服器、移動應用和物聯網等領域的開發,開始並沒有引起注意,直到Flutter的出現才被人們重新重視。Dart發布於2011年,2015年5月Dart開發者峰會上,亮相了基於Dart語言的行動應用程式開發框架Sky ,後更名為Flutter,所以要學Flutter的話我們必須首先得會Dart。Dart是面向對象的、類定義的、單繼承的語言。
  • Flutter源碼剖析(一):源碼獲取與構建
    準備工作 Flutter源碼分為兩個部分:flutter/flutter[1]是框架層,為開發者提供各種接口,主要是dart代碼。flutter/engine[2]是引擎層,負責Flutter的渲染以及宿主的交互。
  • Flutter持久化存儲之key-value存儲
    前言應用開發時會有很多的數據存儲需求,這個時候就需要用到持久化存儲技術,與iOS、安卓一樣,Flutter中也有很多種持久化存儲方式,比如key-value存儲、文件存儲、資料庫存儲等,但其實質都是通過平臺對應的模塊來實現的,本篇我們將帶大家一起了解key-value存儲的應用。
  • 實操|在 Flutter 中創建通信橋
    我們會向 pubspec.yaml 文件中添加依賴:dependencies: flutter: sdk: flutter webview_flutter: ^1.0.7然後,我們需要運行 Pub get 或者在終端中:flutter pub get然後,我們需要在 main.dart 文件中導入這個包:import 'package:webview_flutter
  • 精講Flutter官網的第一個例子
    更多優質免費教程:http://tryenough.com/type-flutter原文連結:https://tryenough.com/flutter04前言學習Flutter你一定會看到官網的第一個例子:中文版 或 英文版。但是作為新手,或許你看的會很費勁,這篇文章的目的是幫助你更好的理解這個例子。