在iOS原生开发中,只要是方法定义了形数,在方法调用时就必须在对应的位置上传递实参;在Flutter中参数定义可以定义非必选参数,可选参数,具名参数和不具名参数.
非具名参数
不具名参数的定义不使用{},只使用小括号即可.例如在Text控件的定义中:
onst Text(
this.data, {
Key key,
this.style,
this.strutStyle,
this.textAlign,
...
}
)
其中data就是不具名参数,但是在调用时第一个位置上必须传data对应的实参.
默认情况下的不具名参数都是要求required的,也就是说没有特别说明的情况不具名参数都是需要传递对应实惨的.如果想要不具名参数时可选的,就需要使用如下定义:
class Person {
Person(this.name, [this.age, this.height]);
final String name;
final int age;
final double height;
}
这样就可以选择性地传递参数:
final person1 = Person("Ericydong");
final person2 = Person("Ericydong", 24); //对应第二个参数位置的24只能给赋值成员变量age,而不可能赋值给height
final person3 = Person("Ericydong", 23, 172);
由于不具名参数没有提供参数的名称给调用者,所以在调用方法时只能依据参数的位置来确定传递的参数赋值给哪一个成员变量.所以对应的位置可以选择是否传递参数,但是如果传递了参数那就肯定是赋值给对应位置的成员变量,而不能跳过某一个位置参数直接赋值给后一个位置的参数,只能按照定义依次赋值.
具名参数给方法定义提供了便利,但是并不能满足所有的场景.例如某个方法可能有很多参数,而在调用时可能只能给出其中不确定顺序的少数某几个参数值,可是如果使用具名参数的话就不得不将随然使用不到但是位置靠前的参数一个一个赋值.
class Man() {
Man(this.name, [this.age, this.height, this. identityCardNumber, this. wordPlace, this. homeAddress]);
final String name;
final int age;
final double height;
final String identityCardNumber,
final String wordPlace;
final homeAddress;
}
//在初始化时我只想给homeAddress赋值,但是不得不一个一个赋值过去,虽然这些值并没有什么实际意义,更致命的如果需要赋值的参数前面很有多个参数的话在赋值过程中极有可能会位置错乱
finale man = Man(null, null, null, null, null, "Union Building")
当参数过多但是并不都是必须参数时这种操作方法的劣势非常明显:
- 在其他没有意义变量赋值上浪费时间,且没有任何意义;
- 在无意义变量的赋值上很容易由于位置错乱而导致变量赋值错误.例如在上述实例中赋值homeAddress之前需要四个null而你不小心写了三个,就会导致"Union Building"赋值给了wordPlace而不是homeAddress.
具名参数
为了弥补非具名参数的不足,flutter还有另外一种参数定义方式:具名参数.与非具名参数不同,具名参数不是根据位置来确定参数的赋值对象而是根据参数名称来确定传递进来的实参要赋值给那个成员变量.
具名参数使用{}来包括参数,参数可以根据参数名来确定需要赋值的对象,所以就拖离了入参位置的束缚,可以根据实际需要给指定的参数赋值,忽略不需要的参数.
class Person {
Person({this.name,this.age, this.height, this.hobby});
final String name;
final int age;
final double height;
final String hobby;
}
final person1 = Person(name: "Ericydong"); //只赋值name
final person2 = Person(height: 172); //只赋值height
final person3 = Person(name: "Ericydong", hobby: "input code", age: 25); //使用任意合法的参数名顺序赋值变量
而当具名变量是必须要在初始化进行赋值时,可以使用@required关键字来进行修饰.
class Person {
Person({@required this.name,this.age, this.height, this.hobby});
final String name;
final int age;
final double height;
final String hobby;
}
被@required修饰的参数必须在初始化进行赋值,否则会抛出异常。
//会抛出异常 The parameter 'name' is required.
final person2 = Person(height: 172);
这样就可以把必须初始化的参数和非必须初始化的参数区分开来,在适当的场景下可以节约开发时间提升效率.