Dart 變量、常量的聲明方式
//聲明變量
var name="你好dart";
String name="張三";
int num = 123;
//聲明常量
const name = "李四";
final name = "張三";
變量聲明可以采用 var 關(guān)鍵字進(jìn)行聲明、或者采用指定類型來聲明 var會自動推導(dǎo)類型
常量可以通過const 和 final來修飾 常量是不能修改的。 const 聲明常量要先賦值,而final修飾常量可以先不賦值。
const 修飾創(chuàng)建同一個對象時 共享同一個存儲空間
Dart 的數(shù)據(jù)類型
int num =123;
double sum = 12.3;
String name = "張三";
// 三個引號聲明字符串可以進(jìn)行換行顯示
String person = ""張三
李四
王五"";
bool flg = true;
//集合 數(shù)組
List l1 = ["小明",123,true];
//創(chuàng)建固定長度的集合
var l2 = List.filled(2,"");
//map類型 類似json對象
Map person = {
"name":"小王",
"age":20
}
//獲取數(shù)據(jù)
person ['name']
Dart 循環(huán)相關(guān)
var l1 = ["小王","小李","小劉"];
l1.isEmpty()//判斷為空
l1.isNotEmpty()//判斷不為空
li.reversed()//翻轉(zhuǎn)數(shù)組 倒敘
//把數(shù)組轉(zhuǎn)換成字符串
l1.join(",");
會輸出 "小王,小李,小劉"
//把字符串轉(zhuǎn)換成數(shù)組
String str="香蕉、蘋果、橘子";
str.split("、");
//數(shù)組循環(huán)的幾種方式
for(var i=0;i<l1.length;i++){};
for(var item in l1){};
l1.forEach((value){
});
var myList = [1,2,3,4,5];
//修改數(shù)組中的數(shù)據(jù) 生成一個新的數(shù)組
var newList = myList.map((value){
return value+1;
});
var newList = myList.where((value){
return value>2;
});
Dart方法的聲明
//沒有返回值 沒有參數(shù)
void myDemo(){
}
//返回值類型為Stirng 傳入字符串參數(shù)
String myDemo(String name){
return name;
}
//可選參數(shù) 調(diào)用的時候可以不傳后面的參數(shù) 如果要穿后面的參數(shù)注意參數(shù)的順序 也可以設(shè)置參數(shù)的默認(rèn)值
void person(String name,[int age =1 ,String sex]){
}
//可以這樣調(diào)用
person("張三")
//命名參數(shù) 在調(diào)用此方法的時候需要傳入?yún)?shù)名來傳參 不用考慮順序問題
void person(String name,{int age =1 ,String sex}){
}
person("李四",sex:"男",age:20);
//匿名方法 可以不聲明方法名和返回值
var fn = (){
}
調(diào)用 fn();
//箭頭函數(shù) 一般只用于方法體內(nèi)一行執(zhí)行
list.forEach((value)=>value+2);
//閉包 局部變量常駐內(nèi)存
fn(){
var num = 123;
return (){
num++;
}
}
var b = fn();
b();
b();
打印的結(jié)果就是 124,125
閉包就是把返回的匿名方法賦給一個變量 調(diào)用這個變量方法會執(zhí)行返回的匿名方法,保留局部變量的值,不會重新賦值。
Dart中的類
//類的構(gòu)造跟java中很類似
class Person{
String name;
int age;
String _sex;//私有屬性 前面加個_
//構(gòu)造函數(shù)
Person(String name,int age){
this.name = name;
this.age = age;
}
//在類實例化之前給變量參數(shù)賦值
Person():name="王五",age =22;
//構(gòu)造方法簡寫
Person(this.name,this.age);
//命名構(gòu)造函數(shù)
Person.set(String name,int age){
this.name = name;
this.age = age;
}
//私有方法
_fun(){
}
//get方法 不用傳參
get myName{
return this.name;
}
//set方法
set myName(String name){
this.name = name;
}
}
調(diào)用命名構(gòu)造函數(shù) 構(gòu)造函數(shù)可以聲明一個 命名構(gòu)造函數(shù)可以聲明多個
Person person = new Person.set("張三",20);
//調(diào)用get 直接通過類似調(diào)用屬性的方式來調(diào)用get獲取類中的變量
person.myName;
//調(diào)用set
person.myName = "李四";
Dart中的靜態(tài)成員變量和類的繼承、接口
static String name="張三"
static String getName(){
return name;
}
采用static來修飾屬性和方法 調(diào)用的時候直接調(diào)用方法名
//操作符
? 條件運算符 不為空的時候引用后面的變量
as 類型轉(zhuǎn)換
is 類型判斷
.. 聯(lián)級操作符 類似構(gòu)建者模式鏈?zhǔn)秸{(diào)用
person.. name
.. age
.. sex;
extends 實現(xiàn)集成類 跟java一樣
abstract 實現(xiàn)抽象類 也可以用做接口 抽象類不能被實現(xiàn)只能被繼承 跟java類似
abstract class Person{
//抽象方法
void name();
}
//抽象方法也可以當(dāng)做接口來實現(xiàn) 接口可以進(jìn)行多實現(xiàn)
class Man implements Person{
}
mixins 可以實現(xiàn)類似多繼承的效果 混入 采用with關(guān)鍵字
class A{
printA(){
print("A");
}
}
class B{
printB(){
print("B");
}
}
class C with A,B{
}
C c = new C();
c.printA();
c.printB();
類似多繼承的形式實現(xiàn)繼承多個類 可以調(diào)用不同類中的方法
注意點:mixins 只能繼承object 不能繼承其它類 不然不能夠被當(dāng)成mixins類 而且不能有構(gòu)造函數(shù)
有相同的方法 后面的會把前面的方法給替換掉
Dart 中的泛型
//T代表泛型 一般使用泛型都是希望類型不固定 返回一個統(tǒng)一的值
T getData<T>(T value){
return value;
}
//調(diào)用指定傳入類型
getData<String>('你好');
//定義泛型類
class MyList<T>{
}
var list = new MyList<String>();
//定義泛型接口
abstract class Person<T>{
//抽象方法
void getName();
}
Dart 中的null聲明 和 late required identical 關(guān)鍵字
//不能直接這樣聲明 會報錯
String name = null
//需要在類型后面加?
String? name = null
跟kotlin中的聲明空對象類似
//初始化屬性時如果不加?號 需要后面給這個屬性賦值再調(diào)用
int name;
//需要在前面加上 late關(guān)鍵字 延遲初始化 跟kotlin中的lateinit概念一樣
late int name;
//required 關(guān)鍵字是聲明方法內(nèi)的命名參數(shù)為必傳參數(shù) {}內(nèi)的參數(shù)表示為命名參數(shù) 傳入數(shù)據(jù)需要根據(jù)參數(shù)名區(qū)分
viod printInfo(String name, {required int age,required String sex}){
}
identical 關(guān)鍵字用來判斷對象是否為同一個 是否指向同一個構(gòu)造空間