Dart基礎(chǔ)(一)

級(jí)別: ★☆☆☆☆
標(biāo)簽:「Flutter 」「Dart」「Dart基礎(chǔ)類型」
作者: WYW
審校: QiShare團(tuán)隊(duì)


前言:
4篇Dart基礎(chǔ)已經(jīng)全部更新完成茸时。目錄如下:
Dart 基礎(chǔ) (一)
Dart 基礎(chǔ) (二)
Dart 基礎(chǔ) (三)
Dart 基礎(chǔ) (四)


筆者最近看了Flutter相關(guān)的內(nèi)容,而Flutter的基礎(chǔ)庫是由Dart編寫的择克,所以筆者學(xué)習(xí)了關(guān)于Dart的部分內(nèi)容峰锁,整理了幾篇關(guān)于Dart基礎(chǔ)的文章步咪。

Flutter 侣诺、Dart簡(jiǎn)介

Flutter is Google’s portable UI toolkit for building beautiful, natively-compiled applications for mobile, web, and desktopfrom a single codebase. (引自Flutter.dev
Flutter 是谷歌的便攜式UI工具包坷备,可以使用一套代碼庫熄浓,來創(chuàng)建漂亮的本地編譯的移動(dòng)端(iOS、Android)應(yīng)用,web(瀏覽器中的頁面)赌蔑、桌面(Mac俯在、Windows、Linux)應(yīng)用娃惯。
Flutter 當(dāng)前最新穩(wěn)定版本是1.5跷乐。

Dart([KK] 英語發(fā)音:/dɑrt/, [DJ] 英語發(fā)音:/dɑ:t/)是一種適用于萬維網(wǎng)的開放源代碼編程語言,由Google主導(dǎo)開發(fā)趾浅,于2011年10月公開愕提。它的開發(fā)團(tuán)隊(duì)由Google Chrome瀏覽器V8引擎團(tuán)隊(duì)的領(lǐng)導(dǎo)者拉爾斯·巴克主持,目標(biāo)在于成為下一代結(jié)構(gòu)化Web開發(fā)語言皿哨。
類似JavaScript浅侨,Dart也是一種面向?qū)ο笳Z言,但是它采用基于類編程证膨。它只允許單一繼承如输,語法風(fēng)格接近C語言。

Dart is a client-optimized language for fast apps on any platform
Dart是客戶端的優(yōu)化過的語言椎例,可用于在任何平臺(tái)(包括移動(dòng)端(iOS挨决、Android)、Web頁面订歪、桌面(Mac脖祈、Windows、Linux)應(yīng)用)刷晋,來創(chuàng)建運(yùn)行流暢的應(yīng)用盖高。

當(dāng)前Dart最新版本是2.4.0,2019-06-27 Dart開發(fā)團(tuán)隊(duì)發(fā)布2.4.0版本Dart眼虱。 Dart change log

下邊喻奥,我們聊一下,關(guān)于Dart安裝捏悬,及查看代碼運(yùn)行效果的內(nèi)容

安裝Dart

Dart 安裝方式可查看:http://dart.goodev.org/install
在 Mac 安裝 Dart 可查看 : http://dart.goodev.org/install/mac

在線演示Dart運(yùn)行效果

DartPad:Dart 在線演示:https://dartpad.dartlang.org

DartPad, an open-source tool, allows you to play with the Dart language features in any modern browser.

DartPad 是一個(gè)開源工具撞蚕,我們可以在現(xiàn)代瀏覽器中使用DartPad來演示Dart語言特性。
筆者的理解就是过牙,我們可以用DartPad在線查看Dart編程效果甥厦。

下邊我們聊一下,Dart的基礎(chǔ)語法相關(guān)的內(nèi)容寇钉。

Dart導(dǎo)入頭文件(資源庫)的方式

// dart:io 為非Web應(yīng)用提供文件刀疙,Socket,HTTP,和其他IO支持扫倡。
import 'dart:io';

// 導(dǎo)入Android設(shè)計(jì)風(fēng)格的material庫
import 'package:flutter/material.dart';

// 導(dǎo)入iOS 的設(shè)計(jì)風(fēng)格cupertino庫
import 'package:flutter/cupertino.dart';

// 只導(dǎo)入material庫中的AppBar
import 'package:flutter/material.dart' show AppBar;

// 導(dǎo)入除了material庫中 除BottomNavigationBar之外 的內(nèi)容
import 'package:flutter/material.dart' hide BottomNavigationBar;

Dart基本語法

  • 1. 輸出語句
    一般我們開始學(xué)習(xí)某門語言的時(shí)候都會(huì)先輸出谦秧,Hello World!或者是Hello 語言名。
    Dart的輸出語句和Swift一樣疚鲤,都是print锥累。Dart的語句需要使用分號(hào)結(jié)尾。
main(){
  print('Hello World!');
  print('Hello Dart!');
}


// 輸出結(jié)果:
/**

Hello World!
Hello Dart!

*/

  • 2. 變量

定義變量使用 關(guān)鍵字var;
如定義變量名為name集歇,值為QiShare的變量揩悄。

  var name = 'QiShare';
  print(name);

// 輸出結(jié)果:
//  QiShare

Dart變量默認(rèn)值為null

  int fansCount;
  //   String fansCount;
  if (fansCount == null) {
    print('null');
  } else {
    print('not null fansCount ${fansCount}');
  }

// 輸出結(jié)果:
  /**
  null
  */
  

輸出變量,需要拼接字符串和變量一起輸出的情況下鬼悠,所有的內(nèi)容都使用''包起來

${變量} 可以用于訪問相應(yīng)的變量的值。

取變量值是否使用{} 分情況:

  • 1.直接訪問實(shí)例的情況 直接使用 $實(shí)例 即可亏娜;

  • 2.訪問實(shí)例的成員變量的情況 需要使用 ${實(shí)例.變量} 焕窝;

  • 3.只是單純輸出實(shí)例或者是實(shí)例的成員變量的情況,不需要使用$维贺。

  • 3. 字符串
    字符串拼接及多行字符串

    // 字符串拼接
    var name = 'QiShare' + 'QiShare';
    print(name);
  
    // 輸出結(jié)果:
    // QiShareQiShare
  
    // 多行字符串
    var name = '''
    QiShare
    QiShare
    QiShare
  ''';
  print(name);
  
  // 輸出結(jié)果:
  /**
  QiShare
  QiShare
  QiShare
  */
  

關(guān)于變量是否對(duì)外可訪問它掂,在iOS Objective-C里邊,如果我們想類文件A的某個(gè)變量對(duì)外可見溯泣,可以在類A.h文件里邊把變量聲明為屬性虐秋。然后只要引用了A.h的類,就能夠訪問A.h中聲明的屬性垃沦。

在Dart中客给,如果要指定某個(gè)變量對(duì)外可訪問,可以在類文件的頂部聲明變量肢簿。

  • 如果想要指定某個(gè)類的實(shí)例變量對(duì)外可訪問靶剑,直接寫在類聲明的內(nèi)部即可。并且變量不要使用下劃線開頭池充。

  • 對(duì)于私有的變量桩引,或者方法,使用下劃線 “_” 在變量收夸、方法前坑匠,則該變量、方法將分別為私有變量卧惜、私有方法厘灼。

  • 對(duì)于其他的多個(gè)常量,整個(gè)項(xiàng)目中使用的情況序苏,可以單獨(dú)創(chuàng)建一個(gè)類文件用于存放公共的常量手幢。

  • 4. 變量類型檢查及值檢查

開發(fā)過程中,在對(duì)服務(wù)端下發(fā)的數(shù)據(jù)忱详,進(jìn)行處理的時(shí)候围来,有時(shí)需要進(jìn)行變量類型判斷,值的檢測(cè)〖嗤福可以參考如下的2種檢測(cè)方式桶错。

一個(gè)是變量類型檢查,使用runtimeType或者使用關(guān)鍵字is進(jìn)行類型檢測(cè)胀蛮;
另一個(gè)是變量的值的檢查院刁。

變量類型檢查

  // runtimeType是用于查看變量類型的。
  // 可以使用runtimeType或is查看變量是什么類型
  
  String QiShare = 'QiShare';
  if (QiShare.runtimeType == String) {
    print(QiShare);
    print('name:${QiShare}');
  }
  

/**
QiShare
name:QiShare
*/


// 使用is 查看變量的類型
String QiShare = 'QiShare';
  if (QiShare is String) {
    print('是String類型 :');
    print(QiShare);
  } else {
    print('非String類型');
  }
/* 輸出結(jié)果:
是String類型 : QiShare
*/

變量的值的檢查粪狼。

// Check for an empty string.
var fullName = '';
if (fullName.isEmpty) {
  print('空字符串');
}

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
if(hitPoints <= 0) {
    print('hitPoints小于等于0');
}

// Check for null.
var unicorn;
if (unicorn == null) {
    print(null);
}

// Check for NaN. The global NaN property is a value representing Not-A-Number.
var iMeantToDoThis = 0 / 0;
if (iMeantToDoThis.isNaN) {
    print('Not a number');
}

  • 5. 類型推導(dǎo)
    使用var 聲明的變量退腥,通過輸出變量的runtimeType ,可以發(fā)現(xiàn)變量的類型可以通過賦給變量的值再榄,自動(dòng)進(jìn)行類型推導(dǎo)狡刘。
  var name = 'QiShare';
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  
/**

QiShare
String

*/

  var name = 10.0;
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  name = 10.1;
  
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  /**
    10
    int
    10.1
    double
  */

/*
上邊的例子很有意思,推導(dǎo)出的10.0的類型為int;
推導(dǎo)出的10.1的類型為double困鸥。
筆者認(rèn)為是編譯器做了優(yōu)化嗅蔬,具體怎么做的,筆者尚不清楚疾就。
*/
  

當(dāng)然除了類型推導(dǎo)知道變量的類型外澜术,對(duì)于我們自己聲明的變量,在已經(jīng)確定變量類型的情況下猬腰,直接直觀地聲明變量類型即可鸟废。

那么對(duì)于var 這種變量的使用場(chǎng)景,筆者想到的有如下2種情況姑荷。

  • 1.接收服務(wù)端返回?cái)?shù)據(jù)的時(shí)候侮攀,避免返回的數(shù)據(jù)類型和預(yù)期的有差異的情況,可以使用var 變量接收厢拭,然后通過類型檢測(cè)后兰英,再進(jìn)一步進(jìn)行數(shù)據(jù)地處理;

  • 2.對(duì)于某些函數(shù)接收的參數(shù)可能是多種類型的情況下供鸠,使用var 來修飾參數(shù)類型畦贸。

  • 6. Final and const
final 聲明的變量只能賦值一次
final name = 'QiShare';
// name = 'QiShareQiShare';
// 報(bào)錯(cuò):
const 是編譯時(shí)常量
const name = 'QiShare'

final 或const修飾的變量只能賦值一次;

const 變量是編譯時(shí)常量楞捂,在編譯的時(shí)候薄坏,我們就已經(jīng)知道了const 變量的值。

頂級(jí)的final 變量或類中的final變量在第一次使用的時(shí)候初始化寨闹。

這里舉一個(gè)類中final變量初始化的例子:

class QiShareMember {
  final String memberID;
  final String memberName;
  QiShareMember(this.memberID, this.memberName);
}

// QiShareMember初始化實(shí)例
QiShareMember member = QiShareMember('id', 'name');


  • 7. List和Map
  var list = ['a', 'b', 1];

  // 遍歷list
  list.forEach( (object){
     print('類型 ${object.runtimeType}');
     print('值${object}');
   }
  );

  // list 中的數(shù)據(jù)
  print(list.length);
              
/**
              
CONSOLE
類型 String
值a
類型 String
值b
類型 int
值1
*/



void main() {
  var gifts = {
// Keys      Values
  'first' : 'partridge',
  'second': 'turtledoves',
  'fifth' : 'golden rings'
};
  
  print(gifts);
  // 獲取Map中的鍵值對(duì)數(shù)目
  print(gifts.length);
  
  // 遍歷字典
  gifts.forEach(
    (key, value){
      print('key:${key}');
      print('value:${value}');
    }
  );
  
  /**
  
CONSOLE
{first: partridge, second: turtledoves, fifth: golden rings}
key:first
value:partridge
key:second
value:turtledoves
key:fifth
value:golden rings

  */

List相當(dāng)于是Swift的數(shù)組胶坠;List的使用場(chǎng)景有:用于放置UI層面的列表數(shù)據(jù)寬泛內(nèi)容;
Map相當(dāng)于Swift的字典繁堡;Map的使用場(chǎng)景有:用于放置UI層面的列表數(shù)據(jù)中更具體內(nèi)容沈善;

舉個(gè)例子:
比如說 如下的數(shù)據(jù)乡数,根據(jù)List中的字典的個(gè)數(shù)可以確定,UI層面上闻牡,需要展示5個(gè)人的信息净赴;
進(jìn)一步根據(jù)List中,每一個(gè)字典中的name罩润,和avatarUrl 可以確定更加細(xì)致的UI層面玖翅,每個(gè)人的個(gè)人信息的名字(name的值)和頭像(avatarUrl 對(duì)應(yīng)的圖片)應(yīng)該顯示什么。

[
  {'name':'QiShare1',
  'avatarUrl':'https://www.so.com....jpg'
},
 
  {
  'name':'QiShare2',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare3',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare4',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare5',
  'avatarUrl':'https://www.so.com....jpg'
}


];
  • 8. 數(shù)據(jù)類型轉(zhuǎn)換

下邊是字符串和整數(shù)割以,浮點(diǎn)數(shù)之間的類型轉(zhuǎn)換金度。

 // String -> int String 類型轉(zhuǎn)換為int 類型
var one = int.parse('1');
 print(one.runtimeType);

// String -> double String 類型轉(zhuǎn)為double類型
var onePointOne = double.parse('1.1');
  print(onePointOne.runtimeType);

// int -> String int 類型轉(zhuǎn)換為String
String oneAsString = 1.toString();
print(oneAsString.runtimeType);

// double -> String double類型轉(zhuǎn)換為String類型
String piAsString = 3.14159.toStringAsFixed(2);
print(piAsString.runtimeType);

/**

int
double
String
String
*/


// List類型轉(zhuǎn)換 把子類型為dynamic的List轉(zhuǎn)換為更為具體的子類型為String的List

  List<dynamic> dynmicList = ['QiShare', 'QiShare'];
  print(dynmicList.runtimeType);
  
  List<String>strList = List<String>.from(dynmicList);
  print(strList);
  print(strList.runtimeType);
  

  /**
  
JSArray
[1, 2]
JSArray<String>
  */
  
  • 9.方法

下邊筆者舉了一個(gè)說出QiShare 年齡的方法。

 int qiAgeNum = qiAgeNumber();
 qiSay('${words()} ${qiAgeNum}');

// 返回值為String類型严沥,參數(shù)為空审姓,名為words方法。
String words(){
  return 'QiShare Age:';
}

// 返回值為空類型祝峻,參數(shù)為String,名為qiSay的方法扎筒。
void qiSay(String words) {
  print(words);
}

// 返回值為空莱找,參數(shù)為空的,名為qiSay方法嗜桌。
void qiAge() {
  print(qiAgeNumber());
}

// 返回值為int奥溺,參數(shù)為空,名為qiAgeNumber 的方法骨宠。
int qiAgeNumber (){
  return 1;
}

/**

// 輸出結(jié)果
QiShare Age: 1

*/

參考學(xué)習(xí)資料


推薦文章:
iOS 短信驗(yàn)證碼倒計(jì)時(shí)按鈕
iOS 環(huán)境變量配置
iOS 中處理定時(shí)任務(wù)的常用方法
算法小專欄:貪心算法
iOS 快速實(shí)現(xiàn)分頁界面的搭建
iOS 中的界面旋轉(zhuǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浮定,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子层亿,更是在濱河造成了極大的恐慌桦卒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿又,死亡現(xiàn)場(chǎng)離奇詭異方灾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碌更,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門裕偿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痛单,你說我怎么就攤上這事嘿棘。” “怎么了旭绒?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鸟妙,是天一觀的道長(zhǎng)焦人。 經(jīng)常有香客問我,道長(zhǎng)圆仔,這世上最難降的妖魔是什么垃瞧? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坪郭,結(jié)果婚禮上个从,老公的妹妹穿的比我還像新娘。我一直安慰自己歪沃,他們只是感情好嗦锐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沪曙,像睡著了一般奕污。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上液走,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天碳默,我揣著相機(jī)與錄音,去河邊找鬼缘眶。 笑死嘱根,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巷懈。 我是一名探鬼主播该抒,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼顶燕!你這毒婦竟也來了凑保?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤涌攻,失蹤者是張志新(化名)和其女友劉穎欧引,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳谎,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡维咸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惠爽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癌蓖。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婚肆,靈堂內(nèi)的尸體忽然破棺而出租副,到底是詐尸還是另有隱情,我是刑警寧澤较性,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布用僧,位于F島的核電站结胀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏责循。R本人自食惡果不足惜糟港,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望院仿。 院中可真熱鬧秸抚,春花似錦、人聲如沸歹垫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排惨。三九已至吭敢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暮芭,已是汗流浹背鹿驼。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辕宏,地道東北人畜晰。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匾效,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恤磷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355