因爲flutter 是用的dart語法,我的以爲,工欲善其事,必先利其器,知道了由什麼寫的,後面就不難啦。設計模式
Mac 安裝bash
一.安裝homebrew後執行閉包
brew tap dart-lang/dart
brew install dart // 安裝穩定版
brew install dart --devel // 安裝開發版
安裝完成後查看路徑
複製代碼
二.配置環境變量,便可在全局使用dart
brew info dart
配置環境變量,找到~/.bash_profile,添加一句,路徑爲剛剛查到的
export PATH=/usr/local/Cellar/dart/2.1.0/bin:$PATH
複製代碼
三.在vscode中使用dartide
新建文件,eg:main.dart函數
安裝code runner擴展程序,每次點擊右上角的三角形圖標便可執行dart編譯。這個擴展程序蠻好用的,能夠支持多種語言的編譯。ui
void main(){}
複製代碼
使用var
聲明變量,可賦予不一樣的值this
未初始化時,默認值爲null
spa
使用final
聲明一個只能賦值一次的變量設計
使用const
聲明常量code
使用const
聲明的必須是編譯期常量
共有Number、String、Boolean、List(列表)、Map(鍵值對)、Runs(不經常使用)、Symbols(不經常使用)
分爲 包括 int(整型)和double(浮點型)
num a = 10; // num 型能夠指定浮點和整型
a =10.2;
int b = 10;
// b = 11.11; // ❌ 具體的類型聲明後不能再賦予爲浮點型了
複製代碼
+,-、*、/ 、 ~/(取整)、%(取餘)
複製代碼
isNaN(是不是非數字)、isEven(是不是偶數)、isOdd(是不是奇數)
複製代碼
abs() // 絕對值
round() // 向下取整
floor() // 向上取整
ceil()
toInt() 、toDouble()
複製代碼
使用單引號或雙引號建立字符串
使用三個引號建立多行字符串
bool aa = true;
複製代碼
var list = new List<dynamic> ();
list..add('1')..add(2)..add(true);
print(list); // ['1',2,true] 動態添加不一樣類型的值
複製代碼
算數運算符
+ - * / ++ --
關係運算符
> < >= <= !=
String str1 ='123';
String str2 = '123';
print(str1 == str2); //true
複製代碼
邏輯運算符
賦值運算符
int m;
m ??= 10;
print(m); //10,若初始值有值則??=後面的值不賦值,若無值則賦值
int m = 5;
m ??= 10;
print(m); // 5
複製代碼
條件表達式
String cc;
String cd ='dart';
String c = cc ?? cd;
print(c); //'dart' 若是前面有值就用前面的沒值就用後面的
複製代碼
if
for
var list =['咱們','要永遠','在一塊兒'];
for(var index = 0;index<list.length;index++){
print(list[index]);
}
for(var item in list){
print(item);
}
複製代碼
void main(List args){} //第一個表示返回類型,void 表達不須要返回類型,括號裏面表示傳參
複製代碼
String getPerson(String name,int age){
return 'name=$name;age=$age';
}
複製代碼
printPerson('niuxialing', 18); //name=niuxialing age=18 gender=null
printPerson('fff',19,gender:'girl'); //name=fff age=19 gender=girl
printPerson1('xiaoling',18,'boy'); //name=xiaoling age=18 gender=boy
printPerson(name,age,{String gender}){
print('name=$name age=$age gender=${gender}'); // 花括號參數能夠隨意組合傳過去
}
printPerson1(name,[int age,String gender]){
print('name=$name age=$age gender=${gender}'); // 中括號必須按照順序傳
}
複製代碼
正常參數必須在可選參數的前面
void main(){
List list = ['i','am','a'];
print(listChange(list,times)); // 傳一個函數做爲參數
}
List listChange(List list,String times(String str)){ 注意:參數定義了類型,函數下面也要定義類型,不然會報錯
for(var index = 0; index < list.length;index++){
list[index] = times(list[index]);
}
return list;
}
String times(String str){
return str * 3;
}
複製代碼
//方式一 賦值給變量調用
var fun = (str){
print('print hello -${str}');
};
fun('niuxiaoling');
// 方式二 自執行
((){
print('調用');
})();
// 方式三 在其餘方法中調用
List listTimes(List list){
var fun = (str){ // 匿名函數
return str*3;
};
for(var index = 0; index<list.length;index++){
list[index] = fun(list[index]);
}
return list;
}
複製代碼
void main(){
var f = fun();
f();
}
fun(){
var count = 0;
return (){
print('aa=$count');
};
}
複製代碼
與Java 很類似
class
聲明一個類new
建立一個對象,new可省略Object
類setter
和getter
方法final
聲明的屬性只有getter方法,就是說不能設置library(庫)
爲單位計算屬性是計算而來的,自己並不存儲值,計算屬性賦值是經過計算轉換到其餘實例變量上面的。
set
和get
方法void main(){
print(rec.area); // 是屬性,不是方法
}
num get area{
return width * height;
}
複製代碼
void main(){
rec.area = 200;
print(rec.width); //180
}
set area(value){
width = value -20 ;
}
複製代碼
class Person{
Person(){} //構造函數
}
複製代碼
方式一(語法糖經常使用 的)
class Person{
String name;
int age; final String gender;
Person(this.name,this.age,this.gender); // 此時的初始化賦值在構造函數以前,因此能夠修改final 聲明的屬性
}
複製代碼
方式二
class Person{
String name;
int age;
final String gender;
Person(String name ,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender; // 此時會報錯,由於final聲明的屬性不能修改
}
String work(){
return '$name is $age,but he is working hard,he is a $gender';
}
}
複製代碼
void main(){
var alice = Person.getName('alice');
}
class Person{
String name;
Person.getName(this.name);
}
複製代碼
void main(){
const a = Person('xiaoling',19);
}
class Person{
final String name;
final int age;
const Person(this.name,this.age); // 必須前面加const
}
複製代碼
factory
實現一個工廠構造方法class Factory{
final String name;
factory Factory(String name){ //工廠構造方法能夠返回對象
return Factory._inter(name); // 返回對象
}
Factory._inter(this.name); // 類私有的命名構造函數
}
複製代碼
final
變量的值void main(){
var a = Person.mapValue({'name':'xoaling','age':19});
}
class Person{
String name;
int age;
final String gender;
Person.mapValue(Map map): name= map['name'],gender = map['gender']{
this.age = map['age'];
}
}
複製代碼
static
關鍵字實現類級別的變量和函數static const
來聲明void main(List<String> args) {
var page = new Page();
page.scrollUp() //報錯
Page.scrollDown(); // 能夠用類直接返回靜態方法
}
class Page{
static const maxPage = 10; //常量必須加關鍵詞static
static int currentpage = 1;
static void scrollDown(){
currentpage = 1;
print('scrollDown...');
}
void scrollUp(){
currentpage++;
print('scrollUp...');
}
}
複製代碼
void main(List<String> args) {
Person person = new Person();
person?.work(); //如有這個屬性就執行,若沒有就什麼都不作
}
class Person{
String name;
int age;
void work(){
print('working');
}
}
複製代碼
var person;
person = '';
person = new Person();
(person as Person).work(); // 變量名賦值過多的狀況下,不知道類型具體是啥,須要進行類型轉換
複製代碼
if(person is Person){
person.work();
}
複製代碼
person..name='tom'
..age = 10
..work();
一直執行,用分號結束
複製代碼
call()
方法,則該類的對象能夠做爲方法使用void main(){
var person = Person();
peron('hah'); // name = hah
}
class Person{
String name;
int age;
String call(String name){
return 'name = $name';
}
}
複製代碼
extends
繼承一個類void main(){
var student = new Student();
print(student.isAudit); //true
}
class Person{
String name;
int age;
bool get isAudit => age>18;
void run(){
print('run,,');
}
}
class Student extends Person{
void study(){
super.run();
print('study....');
}
@override // 重寫父類方法
bool get isAudit => age>=10;
}
複製代碼
void main(){
Student student = Student();
}
class Person{
Person(){
print('父類的構造方法');
}
}
class Student extends Person{
int age;
}
複製代碼
void main(){
Student student = Student('tom');
}
class Person{
String name;
Person(this.name){
print('父類的構造方法');
}
Person.widthName(this.name);
}
class Student extends Person{
Student(String name) : super(name);
}
複製代碼
class Student extends Person{
int age;
final String gender;
Student(String name,String gender): gender = gender,super.widthName(name);
}
複製代碼
abstract
表示。不能直接被實例化abstract
實現,無實現的implements
void main(List<String> args) {
var teacher = new Teacher();
teacher.study(); // teacher 同時擁有3個類的方法
}
class Student1{
void study(){
print('student1 study...');
}
}
class Student2{
void run(){
print('student2 study...');
}
}
class Student3{
void singer(){
print('student3 study...');
}
}
// 若須要Teacher同時擁有上面3個學生的類,用繼承
class Teacher extends Student1 with Student2,Student3{
}
複製代碼
with
鏈接一個或多個mixin格式 返回類型 關鍵字operator (參數1,參數2){
實現體
return 返回值
}
複製代碼
可覆寫的操做符
[]=
>
<
|
/
~/
^
>>
<<
%
[]
*
&
>=
<=
void main(List<String> args) {
var person1 = new Person(19);
var person2 = new Person(30);
print(person1>person2);
print(person1['age']);
print(person1 == person2);
}
class Person{
int age;
Person(this.age);
bool operator >(person){ //定義操做符>
return this.age > person.age;
}
int operator [](String str){ //定義操做符[]
if('age' == str){
return this.age;
}
return 0;
}
}
複製代碼
enum
定義一個枚舉void main(){
var colorbox = Colors.blue;
print(colorbox.index); // 獲取index
switch(colorbox){
case Colors.blue:
print('blue');break;
case Colors.green:
print('green');break;
case Colors.red:
print('red');break;
}
}
enum Colors{
red,
green,
blue
}
複製代碼
在屬性上使用泛型
void main(){
var a = new Type<int>();
a.input(1);
var b = new Type<String>(); // 在屬性上使用泛型
b.input('sss');
}
class Type<T>{
T element;
void input(T element){
this.element = element;
print(this.element);
}
}
複製代碼
void main(){
var p1 = new Person();
p1.input<int>(1);
p1.input<String>('sss');
}
class Person{
void input<T>(T element){
if(T == int){
print('只能輸入數字');
}
if(T == String){
print('只能輸入字符串');
}
}
}
複製代碼