Flutter学习总结(五、Dart的函数)

438 阅读2分钟

Dart的函数

一起从0开始学习Flutter!

与有些语言有些区别的是Dart的函数也是作为对象存在的,也就是说可以作为方法中的参数,也可以赋值给变量,举个例子:

void main() {
  var fun = (str){
      print("str is $str");
  };//将一个匿名函数作为参数进行赋值
  fun("aaa");//str is aaa  调用这个匿名函数并传入参数为"aaa"
  var nFun = printStr;//将函数作为变量进行赋值,注意:赋值函数的时候函数名后面没有括号!!
  fun("hello nFun");//str is hello nFun 调用函数并传入参数
  sendMsg(printStr);//将刚刚赋值给变量的函数作为参数传给sendMsg方法
}
//传入一个函数
void sendMsg(void f(dat)){
  for(int i =0;i<5;i++){
    f(i);//执行传入的函数
  }
}
//创建一个打印字符串的函数
Function printStr(str){
  print("str is $str");
}

乍看起来还是比较难以理解的,我们还是先简单说一下在Dart中基本的函数定义和调用方法。

返回类型  方法名(形参){
  return 返回值
}

这样的结构是一个标准的函数的样式,在Dart中还扩展了一些更加方便我们操作的写法,在Dart中一个方法最简化可以怎么写?

nunFun(str)=>str;
//可以翻译为
String nunFun(String str){
	return str;
}

返回的数据类型可以省略,在返回后动态判断,传入的数据变量也是可以省略,这样只需要一个变量名就写好了一个方法。 在很多语言中我们有重载来定义多个同名方法,但是Dart中是不允许同一个类中有同名函数的,但是有很多脚本语言中的可选参数来代替,个人感觉真是很爽的体验。可选参数有两种方式,一种是根据名称可选,另一种根据位置可选。来个例子:

//根据名称可选
nameParams("Dart",param3:"Java");//不是可选的直接传参,可选的参数需要用 形参名:value 的方式传入
void nameParams(String param1,{String param2,String param3}){//使用{}来包裹名称可选参数
  print("param1->$param1,param2->$param2,param3->$param3");//param1->Dart,param2->null,param3->Java   因为param2没有传入,所以这里的值为null
}
//根据位置可选
positionParams("Dart","","Java");//根据参数位置依次传入值,如果只想传入第一个和第三个那也必须传入第二个,个人感觉不如名称可选灵活。
void positionParams(String param1,[String param2,String param3]){//使用[]来包裹位置可选参数
  print("param1->$param1,param2->$param2,param3->$param3");//param1->Dart,param2->,param3->Java//因为param2传了空字符串,所以这里打印没有null了。
}

可以使用@required关键字来声明该参数是需要传的,但是不传我在实际体验中也没有感受到有强制的效果。

void nameParams(String param1,{String param2,@required String param3}){...}
//使用required必须要导入import 'package:meta/meta.dart';

在Dart中还有一个比较赞的是跟很多脚本语言一样可以直接给形参赋值,这样我们在没有传入这个参数的时候也就有了一个默认值。

nameParams("Dart",param3:"Java"); //这里并没有给param2进行传参操作
void nameParams(String param1,{String param2="Object-c",@required String param3}){
  print("param1->$param1,param2->$param2,param3->$param3");//param1->Dart,param2->Object-c,param3->Java  通过给定的param2的默认值,我们在打印的时候看到了param2是有值的。
}

在Dart中也有函数嵌套,内层的函数可以获取到外层函数的变量,变量的声明周期在该方法内都是有效的。

layerFun(){
  var index = 3;
  print("layerFun");
  layer1Fun(){
    var index1 = 4;
    index = index1;
    print("layerFun1");
    layer2Fun(){
      var index2 = 5;
      index1 = index2;
      print("index->$index,index1->$index1,index2->$index2");
    }
  }
}

在函数多次调用的对象是同一个时还有一种简化写法,使用..后面跟方法名就可以调用其他方法,类似于建造者模式的写法。

"String".toUpperCase()
    ..trim()
    ..toLowerCase();

现在再回过头来看一开始写的将函数作为变量值和方法的参数就好理解了一些,Flutter是万物皆组件,Dart是万物皆对象。

接下来开始学习Dart的类