Flutter之旅
上QQ阅读APP看书,第一时间看更新

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的面向对象。