一、dart語法
1.開發工具
Vscode,安裝外掛程式:dart、Code Runner
2.入口方法
main(){ print('你好,dart'); } // 表示main方法没有返回值 void main(){ print('你好,dart'); }
3 .Dart變數
dart是一個強大的腳本類別語言,可以不預先定義類型,自動會類型推斷
dart中定義變數可以透過var關鍵字來宣告變數
dart中存在型別校驗
## 如:var str = 'this is var'; String str = 'this is string'; int str = 123;
const NUM = 123; final Time = new DateTime.now();
如:var str = 'this is a string'; String str = 'this is a string'; // 定义多行字符串 String str = ''' my name is wq; my age is 23; '''; // 字符串拼接 String name = 'wq'; int age = 23; String myInfo = '我的名字叫$name,我今年$age岁'; // 注意:如果使用+实现字符串拼接,那么必须要是同类型的数据 String firstName = '王'; String lastName = '清'; String myInfo = lastName + ':' + firstName;
布林):bool
bool flag = true;
List(列表):就是js中的陣列
// 第一种定义List的方式 var list1 = [1,2,3]; print(list1.length); // 第二种定义List的方式 var list = new List(); list.add(1); list.add(2); // 定义List指定元素类型 var list = new List<String>(); list.add('王清');
Maps(字典):Map是一個鍵值對相關的物件
// 第一种定义Map var person = { "name": "王清", "age": 23 }; print(person['name']); // 第二种定义Map var p = new Map(); p['name'] = '王清'; print(p); 问:如何判断类型?(关键字 is) var str = '123'; if (str is String) { print('字符串类型'); } else if (str is int) { print('数值类型'); } 注意: 取整运算符 如:print(12~/5); // 2 为空赋值 如:int b; b??=23; print(b); // 23 解释:如果b为空的话就赋值23 int a; int b = a??10; print(b); // 10
6 .型別轉換
1) Number與String型別之間的轉換
①Number轉換為String型toString()
int num = 12; print(num.toString());
2) 其他型別轉換為Booleans型別
String str = '123'; print(int.parse(str)); print(double.parse(str));
o## # length:長度
## # # reverse# var list = [1,2,3];
print(list.reversed.toList());# ##o努:是否不為空白
常用的方法:
add():增加元素,只能增加一個元素
addAll():接合表拼接1,2,3])
indexOf():找出數據,找出回傳元素下標,查找不到回傳-1
remove():移除指定元素
removeAt():刪除指定索引值的元素
fillRange():修改指定區間元素為新的元素list.fillRange(2, 4, 1); // 修改下標2~33間的元素為1
insert(index,value):在指定下標處插入元素
insertAll(index,list):在指定下標記處插入清單 list.insertAll(2 , [100,1]);
toList():其他型別轉換為清單
join():List轉換成字串 String strList = list.join('-');
split():字串轉換成List
#8.Set
Set是無序且不能重複的集合,所以不能透過下標去取得資料;它最主要的功能是清單去重
常用屬性:
isEmpty:是否為空
## isNotEmpty:是否為空## c一個元素
last:返回最後一個元素
# length:長度
常用方法:
addAll:新增為 Set addAll:新增為Set
T ## contains:查詢是否包含單一元素set.contains(1)
containsAll:查詢是否包含多個元素set.containsAll([1,2])
# 返回兩個: set不同的元素set1.difference(set2).toList() intersection:傳回兩個元素相同的元素 union:所有包含兩個set的元素①isEmpty:判断当前字符串是否为空 String str = ''; print(str.isEmpty); ②未赋值 var myNum; print(myNum == null); // true ③为0 var myNum=0; print(myNum ==0); // true ④为NaN var myNum = 0/0; print(myNum.isNaN); // true
firstWhere: 按條件正向查詢第一個符合條件的值
Set set1 = [1,2,3].toSet(); Set set2 = [2,3,4].toSet(); print(set1.union(set2).toList()); // [1,2,3,4]
lastWhere:以條件化查詢第一個符合條件的值##1reee # removeWhere:刪除符合條件的元素
Set set1 = [1,2,100,200,300,3].toSet(); var list = set1.firstWhere((value){ return value > 100; }); print(list); // 200
retainWhere:保留符合條件的
Set set1 = [1,2,100,200,300,3].toSet(); var list = set1.firstWhere((value){ return value > 100; }); print(list); // 300
#
Set set1 = [1,2,100,200,300,3].toSet(); set1.removeWhere((value){ return value > 100; }); print(set1); // {1, 2, 100, 3}
Set set1 = [1,2,100,200,300,3].toSet(); set1.retainWhere((value){ return value > 100; }); print(set1); // {200,300}
如:
Map m = {
"age": 23
};
m.addAll({
"love":[ "外賣員"]
});
# });
# });
# remove(key):以key值移除鍵的鍵值對
:Map中是否存在該value的鍵值對
如: m.containsValue(23);
## containsKey(key):是否存在該#key,##key
# 如: m.containsKey("name")10. forEach map where any every(List、Set、Map通用) [100,200,300,400]; for(var i in list){ print(i); // 100 200 300 400 } forEach循環: List list = [100,200,300,400]; list.forEach((value) => print(value))));c ach((value) =>id;
print(value); // 100 200 300 400
## }# List map循環:##20,0 ;
var newList = list.map((value){
return value * 2;
工作 } // [200,400,600,800]
where循環:
List list = [100,200,300,400] return value > 200;
});
print(newList.toList()); // [300,400]
意義:判斷是否有符合條件的元素,若有回傳true
List list = [100,200,300,400];
var flag = list.any(((value) return value > 200;
});
print(flag);
## every循環:## 若所有元素符合則回傳true
List list = [100,200,300,400];
var flag = list.every((value){#
o# ;## });
print(flag); // true
11.函數、參數、閉包等
1) 功能基本格式
傳回型別方法名稱(參數1,參數2...){
方法體
①定義參數型別為int,若為其他型別錯誤
int getNum(int n){
var n = getNum(60);
print(n); // 60
② 選用參數
String1 ② print
if (age != null && sex != null) {
se {
# return '$name';
}
### }###print(printUserInfo('王清除', 20));
③預設參數
③預設參數
# if (age != null) {
return '$name $age' return '$name';
}
}
print(printUserInfo('王清除'));
User ex, int age=10}){
if (age != null) {
se {
return '$name';
}
: '男',age: 20));
⑤匿名方法
Function fn = (){
# return '# 我是一個函數函數# # print (fn());
⑥箭頭函數:注意箭頭函數不支援多行語句
list.forEach((value)=>print(value));
## 小知識點: 判斷一個數值為偶數還是奇數? isEven 是否為偶數 isOdd 是否為奇數((String str){
print( str);
})('IIFE');
變數會污染全域
局部變數特性:不常駐記憶體會被垃圾回收機制回收、不會污染全域
想要實現功能:常駐內存,且不污染全域
12.類別物件
Dart所有的東西都是對象,所有的物件都繼承自Object類別;
Dart是一門使用類別和單一繼承的物件導向語言,所有的對像都是類的實例,並且所有的類都是Object的子類
如:
class Person{
String name;
int age;
// 建構子
## this.age = age; }# // 命名建構子:命名建構子可以寫多個,但是建構子只能有一個1# int age){ this.name = name; // 建構子可以簡單寫成以下方式 Person(this.name,this.age); void getInfo(){
## == age}");
}
}
v.
p.getInfo();
Person p2 = new Person.now('王思聰』, 30);
p2.getInfo();
p2.getInfo();
}
問:如何抽離類別在另一個檔案中呼叫## 的類別
2.引用
import 'Person.dart';
Person.now('王清',23);
p.getInfo();
}
# 相同物件屬性:## 物件屬性:## 物件沒有private、public、protected這些存取修飾符## 但是我們可以使用_定義一個屬性或方法為私有
私有屬性或方法無法被實例化直接調用,只能透過內部化新方法或屬性去使用
如:
class Person{
// 建構函數可以簡單寫成以下方式
Person(this._name,this.age);
Person.now(String name,int age) {
this._name = name;
# .age = # .age = # # void getInfo(){
print ("${this._name}---${this.age}");
}
}
## 必須抽離成檔案 1)類別中的getter和setter修飾符: class Rect{ num height# num height
# ### Rect(this.height,this.width);
set areaWidth(value){#o
.he # } get area{ return this.height * this.width;# void main(){
Rect r = new Rect(10, 10);
// 透過存取屬性的方式來呼叫get修飾後的方法# // 以賦值的方式來呼叫set給屬性賦值
r.areaWidth = 20;
print(r.area);# print(r.area);#
#> 2) Dart中可以在構造函數體運行之前初始化實例變量 class Rect{ num height; num width; Rect() :height=10,width=10{## }
get area{
## }}
## void main(){
Rect r = new Rect(){
Rect r = 新中#
3)靜態成員
①使用static關鍵字來實現類別層級的變數與函數
## ②靜態方法無法存取非靜態成員,且非靜態方法可存取靜態成員 class Person{ class static String name = '國王清除';static void show(){
print }
void main(){
Person.show();
}
4)Dart
## is 類型判斷 .. 級聯作業## num age; Person(this.name,this.age); this.name}--${ this.age}'); } } p; // 判斷p是否為空,若為空就不要執行方法或屬性 p?.show(); print(p?.name) 問題(p#.物件是否為類別的實例化 if (p is Person) { } var p1; p1 =''; p1 = new Person('清除), 20);# 問題#
(p1 as Person).show();
// 級聯作業
25
..show();
}
5)繼承
②子類別會繼承父類別裡面可見的屬性和方法,但是不會繼承建構子 ③子類別能複寫父類別的方法getter和setter# 如: class Person { String name; num age;##String ## Person(this.name,this.age) ; Person.other(this.name,this.age); .name}--${ this.age}'); } work(){}
}
class Web extends Person{
name,num age,String sex):super(name,age){
this.sex = sex;
與 ) ,age);
void run(){
print('跑步');
}##,#of # // 子類別中透過super呼叫父類別的方法
super.work();
this.height);
}
# // 覆寫父類別中的方法
@override // 可以寫上也可以不寫,並建議寫上#1(m#)> print( '子類別的printInfo');
}
}
main w = new Web('張三', 12,'男');
w.printInfo();
w.work();#
# #.# Dart中抽像類:Dart抽像類主要用於定義標準,子類可以繼承抽像類,也可以實現抽像類接口
①抽像類通過abstract關鍵字定義
②Dart中的抽象方法不能用abstract聲明,Dart中沒有方法體的方法我們成為抽象方法
抽象類別當作介面實現的話語必須實現抽象類別裡面定義所有的方法和屬性
⑤抽象類別不能被實例化,只有繼承它的子類別可以
extends和implements區別:
①如果要重複使用抽象類別裡面的方法,並且要用抽象方法約束自類別的畫我們就用extends繼承抽象類別
抽象類別標準的話我們就用implements實現抽象類別
抽象類別:
abstract class Animal{
## void drink(){ print(' 我想要喝水');# class Dog extends Animal{
@override
# void eat(){
}
@override
void drink(){
print(' 狗想要喝 void run(){
print('跑吧~');
}
}
new Dog();
d.drink();
// 使用Animal ## // a.run(); 錯誤
}
抽象介面:
abstract class DB{
String URL;
remove();
}
class MySQL implements DB{
@override
中使用 add() {
return null;
}
@override
# return null;
}
}
void main(){
}
##實作多重介面 printA();
}
abstract class B{
# class C implements A,B{
@override
printA() {
@override
printB() {
# return null;
}
## # 繼承的功能; mixins使用條件: ①作為mixins的類別只能繼承自Object,不能繼承其他類別 ②作為mixins的類別不能有建構子③一個類別可以mixins多個mixins類別
④mixins絕不是繼承,也不是接口,而是一種全新的特性
如:
# class A{{
# void printA(){ print('A');# class B{
void printB(){
print('B');
class C extends A 與 B{
# }
class D with A,B{
}
void main(){#c##){p.
# c.printA(); c.printB(); D); ”# d.printB();
}
注意:無論是extends還是with,如果存在同樣的方法,誰在後面就調用誰的
14.泛型
理解:泛型是解決類別、介面、方法的複用性以及對不特定資料型別的支援(型別校驗)
①泛型方法
T getData
return value;
print(getData< ;int>(21));
}
②泛型類別
class MyArray
List list = new List
void add(T value){## }
}
void main(){
MyArray myArray = new MyArray
myArray.add('wq');
}
③泛型介面
抽象類別Cache
1 ) ykey(字串鍵,T 值);
}
# class FileCache
@override
getByKey(String key) {##卷 }
@override
void setBykey(String key, T value) {
print('$key --- $value');## c }
void main(){
## FileCache fc = new FileCache## }
15.Dart中的函式庫
①我們自訂的函式庫
import 'lib/XXX.dart';
import 'lib/XXX.dart';#
②系統內建函式庫 import 'dart:io'; import 'dart:convert';result = wait getDataFromZhihuAPI();
print(result);
}
## 3/stories/latest getDataFromZhihuAPI() async{ //1、建立HttpClient#,
//2、建立Uri.http('news-at.zhihu.com','/api/3/stories/latest');
## //3、啟動請求,等待請求 var request = wait httpClient.getUrl(uri);### var response = wait request.close();
//5、解碼回應的內容物
## ampp //5、解碼反應}
## ③Pub 管理系統中的函式庫 第一步:從網址找到使用的資料庫##
# https://pub.flutter-io.cn/packages https://pub.dartlang.org/flutter/#aspec 創造 https://pub.dartlang.org/flutter/
#yaspec 創建 文件,內容如下: name: xxx 說明:一個新的flutter 模組專案。 http: ^0.12.1 第四步:在檔案所在目錄執行pub get 第五步:寫入程式碼 import 'package:### import 'dart:convert' as conversion;
void getData() 為 1 .php?a = getPortalList&catid=20&page=1';
var response = wait http.get(url);
print(convert.jsonDecode(response.body));
'請求失敗');
}
# }
# void main(){
小知識重點:
①部分導入
import 'lib/myMath.dart' show getName; // 只引入getName方法
getNames 名詞
錯誤方法 錯誤# ②延時加載(deferred as) 也成為懶加載,可在需要的時候進行加載,減少App的啟動時間#. import 'XXX .dart' deferred as XXX; getData() async {## XXX }
以上是Dart基礎知識點總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!