Dart在1.0的時候是弱類型
Dart在2.0的時候是強類型
閉包有什么用?
變量類型
- var 是一個可選類型,dart會自動推斷它的數(shù)據(jù)類型,并不存儲值,它存值的對象的引用丽蝎;
- dynamic 實際運行的是一個Object,他是運行期的膀藐,編譯器不會對對象檢查
- Object 在編譯器會對對象檢查
變量默認值
- 沒有初始化的變量自動獲取一個默認值為null
- 一切皆對象屠阻,對象的默認值為null
變量-final和const
- 聲明的類型可省略
- 初始化后不能再賦值
- 不能和var同時使用
// const和final變量 對象聲明時候,類型可以省略
// 值聲明過了额各,值不可以修改
const String str = "";
const str1 = "1";
final str2 = "2";
const與final區(qū)別
- static const:表示靜態(tài)常量
- const與final區(qū)別:const在編譯期間要確定值国觉,final在運行時確定值
- const定義的構(gòu)造函數(shù)的類的成員變量需要用final修飾
// 因為const的構(gòu)造函數(shù)需要傳遞value const是在編譯器的值,final在運行時確定值
class Man{
final value;
const Man(this.value);
}
const a = 1;
const b = a;
final c = 10;
const d = c; // 不可以這么做虾啦,因為final是運行時賦值麻诀,const編譯時賦值
String
- Dart 字符串是 UTF-16 編碼的字符序列,可以使用單引號或者雙引號來創(chuàng)建字符串
- 可以使用三個單引號或者雙引號創(chuàng)建多行字符串對象
- 可以使用 r 前綴創(chuàng)建”原始raw”字符串 這樣轉(zhuǎn)義符號就無法使用
- 可以在字符串中使用表達式: ${expression},如果表達式是一個標識符傲醉,可以省略 {}蝇闭,如果表達式的結(jié)果為一個對象,則 Dart 會調(diào)用對象的 toString() 函數(shù)來獲取一個字符串硬毕。
String s1 = 'hello' 'word';
String s2 = "hello" "word" + "000";
String s3 = '''
hello
word
000
''';
String s4 = r'''
hello
word\n
000
''';
print(s1);
print(s2);
print(s3);
print(s4);
--------------------------------------------------------
helloword
helloword000
hello
word
000
hello
word\n
000
函數(shù)
匿名函數(shù)
// 匿名無參函數(shù)
var fun1 = () {
print(111);
};
var fun2 = () => print(222);
// 匿名有參
var fun3 = (val) => print(val);
fun1();
fun2();
fun3("hello");
可選位置參數(shù)函數(shù)
可選命名參數(shù)
// 普通函數(shù)
fun1(1, 1, 1);
fun2(1);
fun3(1,b: 5,c: 2);
fun1(a, b, c) => print("a=$a b=$b c=$c");
// 可選位置參數(shù)呻引,用[] 表示,參數(shù)要按著位置寫先寫b再寫c
fun2(a, [b = 1, c]) => print("a=$a b=$b c=$c");
// 可選命名參數(shù)昭殉,可以直接寫b =
fun3(a, {b = 5, c}) => print("a=$a b=$b c=$c");
--------------------------------------------------------
a=1 b=1 c=1
a=1 b=1 c=null
a=1 b=5 c=2
閉包
定義 一個函數(shù)內(nèi)部的函數(shù)苞七,不嚴格的說相當于java的內(nèi)部類或者匿名內(nèi)部類藐守。再簡單點說-
就是函數(shù)套函數(shù)挪丢。
函數(shù)簽名
是方法名稱和參數(shù)類型蹂风,叫做函數(shù)簽名。
?. 相當于不為空則顯示點后方法乾蓬,為空顯示null
String str = "xxx";
str !=null?str.length:null;
如果str不是null 則顯示長度惠啄,是null 就顯示null
等同于 str?.length 相當于不為空則顯示長度,為空顯示null
?? 相當于為空則賦值=號后的不為空則是本身
String str;
str == null?"xxx":str;
str ??="xxx";
~/ 除法取整
print(1~/2);
print(2~/2);
print(3~/2);
print(4~/2);
--------------------------------------------------------
0
1
1
2
循環(huán)
List list = [1,"a",2,"t",true];
list.forEach((val)=>print("這里是循環(huán)$val"));
for(var val in list){
print(val);
}
異常
- Error異常:大部分是DartVM的異常例如OutOfmemory
- Exception異常 :大部分是需要程序員自己解決的異常
- 自定義異常
構(gòu)造函數(shù)
- 只能有一個非命名構(gòu)造函數(shù)任内,也就是類名() 就是非命名構(gòu)造函數(shù)
// 只能有一個非命名構(gòu)造函數(shù) , 下面3個只能存在一個
Man();// 非命名構(gòu)造函數(shù)
Man(this.name,this.age); // 非命名構(gòu)造函數(shù)
Man(String name,int age){
this.name = name;
this.age = age;
}
常量構(gòu)造函數(shù)
常量構(gòu)造函數(shù)是放在常量池中撵渡,相同的構(gòu)造函數(shù)即使是new也是同一個構(gòu)造函數(shù)
重定向構(gòu)造函數(shù)
直接重定向函數(shù),是命名構(gòu)造函數(shù)重定向到非命名構(gòu)造函數(shù)死嗦,或者子類構(gòu)造函數(shù)繼承父類趋距,然后進行重定向父類的某個構(gòu)造函數(shù),使用:來表示重定向
class Man {
String name;
int age;
// 只能有一個非命名構(gòu)造函數(shù)
// Man();// 非命名構(gòu)造函數(shù)
Man(this.name, this.age); // 非命名構(gòu)造函數(shù)
// Man(String name,int age){
// this.name = name;
// this.age = age;
// }
// 重定向構(gòu)造函數(shù)
Man.setZSInfo(name, age) : this("張三", 16);
Man.setZSInfo1() : this("張三", 16);
}
class Person {
int age;
String name;
Person.setData(this.name, this.age);
@override
String toString() {
return 'Person{age: $age, name: $name}';
}
}
class SubPerson extends Person {
int age;
// 重定向構(gòu)造函數(shù)越除,子類重定向父類的setData函數(shù)节腐,使用:來重定向
SubPerson.setData(String name, int age) : super.setData(name, age);
}
單例
main() {
var singleTong = SingleTong();
var singleTong2 = SingleTong();
print(singleTong == singleTong2); // true
}
// 餓漢式
class SingleTong {
// 定義私有命名構(gòu)造函數(shù),_表示私有摘盆,命名給省略了
// 因為是_私有翼雀,在其他類中無法調(diào)用這個命名構(gòu)造
SingleTong._();
// 靜態(tài)的對象 私有的 ,對象是上面的構(gòu)造函數(shù)獲得
static final SingleTong _singleTong = SingleTong._();
// 工廠函數(shù)的關(guān)鍵字孩擂,通過代碼決定返回實例狼渊,從緩存中獲取實例,也是調(diào)用返回實例的方法
factory SingleTong() => _singleTong;
}
工廠方法 通過實現(xiàn) 繼承 abstract抽象類
// 構(gòu)建工廠 抽象類 俱樂部
abstract class Club {
Club.extendsClub();
factory Club(type) {
switch (type) {
case "sky":
return SkyClub();
case "water":
return WaterClub();
case "normal":
return NormalClub();
}
}
getMsg();
}
class SkyClub extends Club {
// 如果是繼承类垦,因為factory Club 這個非命名構(gòu)造函數(shù)占用狈邑,
// 所以重定向到命名構(gòu)造函數(shù)
SkyClub() : super.extendsClub();
@override
getMsg() {
return "天上人間msg";
}
}
class WaterClub implements Club {
@override
getMsg() {
return "水世界msg";
}
}
class NormalClub implements Club {
@override
getMsg() {
return "Normalmsg";
}
}
Mixin多繼承 多個類功能的合并
如下圖,交通工具是個父類蚤认,動力米苹、安全系數(shù)、動力來源烙懦,是抽象父類驱入,自行車,摩托車氯析,汽車亏较,可以繼承交通,也可以繼承動力安全掩缓,來進行多繼承雪情,把所有的功能進行合并。
父類有個call方法你辣,子類可以直接使用
使用mixin 關(guān)鍵字后巡通,后面繼承多個類尘执,如果使用方法在繼承的多個類中都存在,則會使用with最后一個類的方法
car("子類直接使用父類的方法宴凉,只有call");
}
// 抽象 交通類
abstract class Transportation {
call(str)=>{print(str)};
getInfo();
}
class A {
showMsg() {
print("a");
}
}
class B {
showMsg() {
print("b");
}
}
class C {
showMsg() {
print("c");
}
}
class AB extends A with B,C{
@override
showMsg() {
return super.showMsg();
}
}
AB().showMsg();
----------------------------------------
打印的是c with 后的最后一個類
導包
如果有多個類誊锭,可以只導入一個類,然后讓這個類把剩下的類都引入弥锄,之后導入的這個類丧靡,就能訪問所有的方法
part of 'libs.dart';
class A {
a() {}
}
----------------------------------
part of 'libs.dart';
class B {
b() {}
}
----------------------------------
part 'a.dart';
part 'b.dart';
class Libs{
showLib(){
print('libs');
}
}
// 引入libs類,可以直接方法a籽暇,b類的方法和libs的方法
import 'package:flutter_nd_study/utils/libs.dart';
main(){
Libs().showLib();
A().a();
B().b();
}
as 關(guān)鍵字温治,可以重命名導入的類名,然后使用
import 'utils/c.dart' as newC;
newC.C().c();
show 關(guān)鍵字,只有導入的類中 show的子類能顯示別的不能
part of 'libs.dart';
class D {
d() {}
}
class DD {
dd() {}
}
class DDD {
ddd() {}
}
import 'utils/d.dart' show DD;
只能調(diào)用DD類
import 'utils/d.dart' hide DD;
隱藏DD類
import 'utils/d.dart' deferred as DD;
延遲加載dd
異步
- 并發(fā):系統(tǒng)管理多個IO的切換教給CPU來處理
- 并行:多核CPU在同一時間執(zhí)行多個任務
協(xié)程
執(zhí)行到async表示進入了一個協(xié)程戒悠,會同步執(zhí)行async代碼快熬荆。async本質(zhì)也是函數(shù),并有自己的上下文環(huán)境绸狐。當執(zhí)行到await表示有任務需要等待卤恳。CPU就去調(diào)度其他IO。過段時間就會輪詢六孵,看是否有協(xié)程完成了纬黎,完成后就繼續(xù)執(zhí)行。