Flutter 學(xué)習(xí)從零開始-Dart方法

聲明:文章都是搬運并整理

Dart是一種真正面向?qū)ο蟮恼Z言,所以函數(shù)也是對象并且類型為Function,這意味函數(shù)可以被賦值給變量或者作為其他函數(shù)的參數(shù)。你也可以像調(diào)用函數(shù)一樣調(diào)用Dart 類的實例

參數(shù)

  • 函數(shù)可以有兩種形式的參數(shù): 必要參數(shù)和可選參數(shù)
  • 必要參數(shù)定義在參數(shù)列表的前面,
  • 可選參數(shù)定義在必要參數(shù)的后面

可選參數(shù)

  • 可選參數(shù)分為命名參數(shù)和位置參數(shù)
  • 可在參數(shù)列表中任選其一使用,但是不能混用
// 可選參數(shù) 設(shè)置默認值  
var add(int a ,int b,{int c = 0, int d}){
  return a+b;
}

main(){
int c = add(2,3);
int d = add(2,3,c:4,d:5);
}
  • 使用 參數(shù)名:參數(shù)值的形式來指定命名參數(shù)
  • 用大括號來指定命名參數(shù)
  • 可以提供默認值
  • @required 注解來標示一個命名參數(shù)是必須的參數(shù)

位置參數(shù)

int addValue(int a,[int b, int c]){
 return a+(b??0)+(c??0);
}
addValue(1);
addValue(1,2);
addValue(1,2,3);

int addValue(int a,[int b=0,int c =0]){
 return a+b+c;
}
  • 使用[]將一系列參數(shù)包裹起來作為位置參數(shù)
  • 可以用 = 為函數(shù)的位置參數(shù)定義默認值,默認值必須為編譯時常量,沒有指定默認值的情況下默認值為null

main() 函數(shù)

每個Dart 程序都必須有一個main() 頂級函數(shù)作為程序的入口,main()函數(shù)返回值void 并且有一個List<String> 類型的可選參數(shù)

函數(shù)作為一級對象

  • 可以將函數(shù)作為參數(shù)傳遞給另一個函數(shù)
  • 可以將函數(shù)賦值給給一個變量
main(){
  add(1,2,addResult);
  var temp = addResult; //將函數(shù)賦值給一個變量
  add(1,2,(v){ //匿名函數(shù)
    print(v);
  });
  var a =(v)=>"xxx $v"; //箭頭函數(shù)
  add(1,2,(v)=>{
     print(v)
  });
}
// 將addResult 作為參數(shù)傳如add函數(shù)中。
add(int a,int b,Function callback){
  callback(a+b);  // 調(diào)用addResult
}
addResult(int result){
  print(result);
}

匿名函數(shù)

  • 沒有名字的函數(shù)就是匿名函數(shù)
  • 稱之為匿名函數(shù),或Lambda表達式Closure 閉包
([[類型] 參數(shù)[,...]]){
    函數(shù)體;
};

立即執(zhí)行函數(shù)

((name){
 print('my name is ${name}');
})('postbird'); //my name is postbird

詞法作用域

  • 變量的作用域在寫代碼的時候就確定來
  • 大括號內(nèi)定義的變量只能在大括號內(nèi)訪問

詞法閉包

  • 閉包 即一個函數(shù)對象,即使函數(shù)對象的調(diào)用在它原始作用域之外,依然能訪問在它詞法作用域的變量
  Function getA() {
    int a = 0;
    return () {
      a++;
      print(a);
    };
  }

  Function b = getA();
  b();  //1
  b();  //2

函數(shù)是否相等

void foo(){} //頂層函數(shù)
class A {
  static void bar(){} //定義靜態(tài)方法
  void baz() {} // 定義實例方法
}
main(){
  var x;
// 比較頂層函數(shù)是否相等。
x = foo;
assert(foo == x);
// 比較靜態(tài)方法是否相等。
x = A.bar;
assert(A.bar == x);
// 比較實例方法是否相等
var v = A(); //A 的實例 #1
var w = A(); //A 的實例 #2
var y = w;
x = w.baz;
// 這兩個閉包引用來相同的實例對象,因此它們相等。
assert(y.baz == x);
// 這兩個閉包引用來不同的實例對象,因此它們不相等。
assert(v.baz != w.baz);
}

返回值

  • 所有函數(shù)都有返回值
  • 沒有顯示返回語句的函數(shù)最后一行默認執(zhí)行return null
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容