2.1.3 函数的使用
函数的基本用法
函数作为一个逻辑单元的封装,是实现代码复用最直接、最有效的方式。现在来实现一个需求——在每次构建文本时使文本的颜色随机显示。现在针对的是主页中的文字,所以只要在home_content.dart中修改即可。Text组件的颜色通过style属性设置,比如修改成红色:
Text( 'You have pushed the button this many times:', style: TextStyle(color: Colors.red) )
对于Color对象,可以根据argb四个颜色通道分量进行控制,值为0~255之间:
随机数可使用Random对象生成。可以封装一个randomColor函数来获取Color对象,使用方式为TextStyle(color:randomColor()):
---->[day02/02/main.dart]---- Color randomColor(){/// 用来返回一个随机色 var random=Random(); var a = random.nextInt(256);//透明度值 var r = random.nextInt(256);//红值 var g = random.nextInt(256);//绿值 var b = random.nextInt(256);//蓝值 return Color.fromARGB(a, r, g, b);//生成argb模式的颜色 }
Dart语言中的函数定义和其他语言非常类似,它最大的特点是没有关键字(如JavaScript中的function,Kotlin中的fun,Swift中的func等),Dart直接使用函数名即可,函数名前是返回值的类型。
函数的普通参数、可选参数与键值参数
现在会有一个问题,由于是随机数,透明度太低会导致可能几乎看不到内容,这时可以用参数来控制透明度的下限。这里使用limitA作为入参来指定下限:
Color randomColor(int limitA){ var random=Random(); var a = limitA+random.nextInt(256-limitA);//透明度值 var r = random.nextInt(256);//红值 var g = random.nextInt(256);//绿值 var b = random.nextInt(256);//蓝值 return Color.fromARGB(a, r, g, b);//生成argb模式的颜色 } ---->[使用]---- randomColor(100);//透明度下限为100
但这样每次都要传参,而且不能设置默认值。通过[ ]符号可以指定若干个可选参数,但使用时入参必须按顺序来排列:
Color randomColor([int limitA=120,limitB=100]){ var random=Random(); var a = limitA+random.nextInt(256-limitA);//透明度值 var r = random.nextInt(256);//红值 var g = random.nextInt(256);//绿值 var b = limitB+random.nextInt(256-limitB);//透明度值 return Color.fromARGB(a, r, g, b);//生成argb模式的颜色 } ---->[使用]---- randomColor(100);//透明度下限为100,绿通道值为100
当参数过多时容易混淆,有时候更希望可以不按函数入参顺序传入参数,这时键值参数就能大显神通,通过{ }可以指定若干个参数,使用方式类似键值对,通过键名来进行传参:
Color randomColor({int limitA=120,int limitR=0,int limitG=0,int limitB=0,}){ var random=Random(); var a = limitA+random.nextInt(256-limitA);//透明度值 var r = limitR+random.nextInt(256-limitR);//红值 var g = limitG+random.nextInt(256-limitG);//绿值 var b = limitB+random.nextInt(256-limitB);//蓝值 return Color.fromARGB(a, r, g, b);//生成argb模式的颜色 } ---->[使用]---- randomColor(limitA: 100,limitB: 40); //用键值参数
函数类型
Dart语言是完全面向对象的语言,就连函数本身都是对象。对象的运行时类型可以通过XXX.runtimeType获取。这里可以打印一下:
print(randomColor.runtimeType);
结果如下:
({int limitA, int limitR, int limitG, int limitB}) => Color
既然函数是一种类型,那就可以作为变量。例如,想要在调用add时先对两个数进行操作后再相加,比如求平方和、立方和、绝对值和、10倍和等,很简单,如下所示:
函数简写
除此之外,Dart语言还提供了优雅的简写语法糖。首先入参和返回值的类型可以省略。当然有得必有失,一旦省略,IDE就不知道它是什么类型,无法提示相关API,所以建议最好加上,这样可读性会提高。另外,在Day 1也提到Dart的箭头函数简化书写,当函数体只有一行语句时,=>表示执行并返回语句结果,下面的代码中左右两侧的写法是等价的:
工具方法类的封装
前面的随机颜色函数很有用,既然复用性好,作为一个工具类使用是不错的选择。而且有人会觉得,每次调用randomColor都会创建一个Random对象,貌似不太好,所以用面向对象的方式简单封装一个工具类还是很必要的。现在将学过的几个小知识点梳理一下:
新建utils工具包来盛放实用工具类。
定义一个RandomProvider类提供随机数对象,当需要使用随机数对象时,就不用每次都创建新的Random对象,方便复用。这里使用final是为了声明此处的_random对象不想被修改,注意Random()是在运行时才能获得的,所以不能使用const来声明:
定义一个ColorUtils类用于处理颜色,将randomColor以静态方法放入ColorUtils中,当需要随机数时,直接调用ColorUtils.randomColor()即可。另外,其他实用的颜色函数也可以放入其中,比如,定义parse方法解析形如“#428A43”“#33428A43”的颜色。
---->[day02/03/utils/color_utils.dart]---- class ColorUtils{ static Color randomColor({ int limitA=120,int limitR=0, int limitG=0,int limitB=0,}){ var random = RandomProvider.random; var a = limitA+ random .nextInt(256-limitA);//透明度值 var r = limitR+ random .nextInt(256-limitR);//红值 var g = limitG+ random .nextInt(256-limitG);//绿值 var b = limitB+ random .nextInt(256-limitB);//蓝值 return Color.fromARGB(a, r, g, b);//生成argb模式的颜色 } } static Color parse(String code) { Color result =Colors.red; var value = 0 ; if (code.contains("#")) { try { value = int.parse(code.substring(1), radix: 16); } catch (e) { print(e); } switch (code.length) { case 1 + 6://6位 result = Color(value + 0xFF000000); break; case 1 + 8://8位 result = Color(value); break; default: result =Colors.red; } } return result; }
好了,对Dart语言基本语法的介绍就告一段落,Dart语言的运算符、控制语句等的用法也与其他语言大同小异,这里就不一一介绍了。下面来看Dart的面向对象。