一日一钱,千日一千。绳锯木断,水滴石穿。

Functions Paramaters——Dart

Posted on By TinyVampirePudge

Functions Paramaters——Dart

Dart是一个完全面向对象的语言,它的方法也是对象,对应的类型为Function

这意味着方法也能被赋值给变量,或者当做参数传递给其他方法。

你也可以像操作方法那样操作Dart的类的实例,具体请参照Callable classes

下面是一个方法的的示例:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

省略参数类型

你可以省略参数类型,

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

只有一行表达式时可以使用简写语法

如果方法只有一行表达式,你可以使用简写语法:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

=> expr语法是{ return expr; }的简写形式.=>符号可以参考箭头表达式。

注意:只有表达式——不是一个声明——可以出现在=>;之间。例如,你不能放入if语句,但是你可以使用一个条件表达式。

方法的参数类型有两种,requiredoptional

required参数会优先展示,后面跟着可选参数。

可选参数

可选参数也可以添加命名或者位置参数,但不能同时添加。

可选命名参数—— {}

定义方法时,通过{param1, param2, …}的形式来指定命名参数,如下所示:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {

}

调用该方法时,通过paramName: value的形式来指定命名参数。如下所示:

// 正常调用
enableFlags(bold: false, hidden: false);
// 参数调换顺序
enableFlags(hidden: false, bold: false);
// 只传入第一个
enableFlags(bold: false);
// 只传入第二个参数
enableFlags(hidden: false);

Flutter中的widget构造器只能采用命名参数的形式来定义。

在Dart代码中, 你可以给任意的命名参数添加@required参数,表示这个命名参数是必不可少的。代码如下:

const Scrollbar({Key key, @required Widget child})

Required定义在meta包下。 直接通过import package:meta/meta.dart导入包,或者导入其他包含meta的包,比如Flutter的package:flutter/material.dart

可选位置参数—— []

使用[]将参数(一个或多个)包裹起来,即可将它们标记为可选参数。 另外,可选位置参数需要放在参数列表的末尾。

// 可选位置参数
String say(String from, String msg, [String device, String name]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}
// 不调用可选参数
print('${say("China", "Beijing")}');
// 调用第一个可选参数
print('${say("China", "Beijing", "mate 10 pro")}');
// 调用两个可选参数
print('${say("China", "Beijing", "mate 20 X", "wangcai")}');

输出结果:

China says Beijing
China says Beijing with a mate 10 pro ,
China says Beijing with a mate 20 X , name: wangcai

参数默认值—— =

可以使用=给参数设置默认值,命名参数和可选参数均可。默认值必须是编译器常量。如果没有提供默认值,则默认值就是null。

给命名参数设置默认值

代码如下:

void setDefaultValues(
    {bool value1 = true,
    String value2 = "value2",
    int value3 = 10,
    double value4}) {
  print('value1: $value1, value2: $value2, value3: $value3, value4: $value4');
}
// 参数默认值
setDefaultValues();
setDefaultValues(value1: false, value2: "abc", value3: 100, value4: 1000.11);
setDefaultValues(value1: true);
setDefaultValues(value2: "tiny");
setDefaultValues(value3: 1000);
setDefaultValues(value4: 100.0);

输出结果:

value1: true, value2: value2, value3: 10, value4: null
value1: false, value2: abc, value3: 100, value4: 1000.11
value1: true, value2: value2, value3: 10, value4: null
value1: true, value2: tiny, value3: 10, value4: null
value1: true, value2: value2, value3: 1000, value4: null
value1: true, value2: value2, value3: 10, value4: 100.0

需要注意的是,老版本代码可能使用:来设置参数默认值,这个已经被废弃了,现在推荐使用=来指定参数默认值。

给可选参数设置默认值
// 可选参数设置默认值
void setDefaultValuesToOptional(bool value1, String value2,
    [int value3 = 10, double value4]) {
  print('value1: $value1, value2: $value2, value3: $value3, value4: $value4');
}
// 参数默认值——可选参数
setDefaultValuesToOptional(true,"11111");
setDefaultValuesToOptional(true,"11111",100);
setDefaultValuesToOptional(true,"11111",100,1000.0);

输出结果:

value1: true, value2: 11111, value3: 10, value4: null
value1: true, value2: 11111, value3: 100, value4: null
value1: true, value2: 11111, value3: 100, value4: 1000.0
默认参数也可以设置list和map
void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
  print('list:  $list');
  print('gifts: $gifts');
}
doStuff();
doStuff(list: [4,5,6],gifts: {"11":"11","22":"22"});
doStuff(list: [1]);
doStuff(gifts: {"33":"33"});

输出结果:

list:  [1, 2, 3]
gifts: {first: paper, second: cotton, third: leather}
list:  [4, 5, 6]
gifts: {11: 11, 22: 22}
list:  [1]
gifts: {first: paper, second: cotton, third: leather}
list:  [1, 2, 3]
gifts: {33: 33}