方法¶
完整定义¶
int sum(int a, int b) {
return a + b;
}
返回值和参数类型可以省略¶
///省略返回值和参数类型
sum1(a, b) {
return a + b;
}
箭头函数¶
当方法的执行语句只有一句的时候,可以使用箭头函数=>
表达式
void main() {
runApp(App());
}
//等于下面一行
void main() => runApp(App());
///箭头函数
sum2(a, b) => a + b;
可选参数¶
可选参数{var b}
:参数可传可不传。
参数可为空int? c
:参数可以为空。
定义可选参数,传递参数的时候必须带上形参的名字。
void functionDemo() {
print(sum3(1, c: 5, b: 3));
print(sum5(1, 2, 3));
}
///可选参数带类型,可为空?
sum3(int a, {var b, int? c}) {
b ??= 0;
c ??= 0;
return a + b + c;
}
///默认值
sum4(int a, {var b, int c = 0}) {
b ??= 0;
return a + b + c;
}
///基于位置
sum5(int a, [int b = 0, int c = 0]) {
return a + b + c;
}
在 Dart 和 Flutter 中,可以在类的构造函数中定义参数。以下是一些示例:
位置参数:¶
class MyClass {
int a;
String b;
MyClass(int a, String b) {
this.a = a;
this.b = b;
}
}
你可以使用下面的方式创建一个新的 MyClass
实例:
MyClass myObject = MyClass(10, 'Hello');
可选参数:¶
可选位置参数:
class MyClass {
int a;
String b;
MyClass([this.a, this.b]);
}
你可以使用下面的方式创建一个新的 MyClass
实例:
MyClass myObject1 = MyClass();
MyClass myObject2 = MyClass(10);
MyClass myObject3 = MyClass(10, 'Hello');
命名参数(可选命名参数)¶
class MyClass {
int a;
String b;
MyClass({this.a, this.b});
}
可以使用下面的方式创建一个新的 MyClass
实例:
MyClass myObject1 = MyClass();
MyClass myObject2 = MyClass(a: 10);
MyClass myObject3 = MyClass(a: 10, b: 'Hello');
在 Dart 中,所有的命名参数默认都是可选的,所以可以选择提供或不提供这些参数。
必需命名参数¶
如果你想让命名参数成为必需的,你需要使用 required
关键字,这是 Dart 2.12 引入空安全之后的一个特性。这里是如何定义带有必需命名参数的构造函数:
class MyClass {
int a;
String b;
MyClass({required this.a, required this.b});
}
在这种情况下,当你创建 MyClass
的实例时,你必须提供 a
和 b
参数:
MyClass myObject = MyClass(a: 10, b: 'Hello');
如果你不提供所有的必需参数,Dart 编译器将会报错。
另外,如果你想要命名参数是可选的,但是当它们被传递时必须不为 null
,你可以为它们提供一个默认值:
class MyClass {
int a;
String b;
MyClass({this.a = 0, this.b = 'Default'});
}
在这个例子中,如果你创建一个 MyClass
的实例时没有提供 a
或 b
,它们会分别使用默认值 0
和 'Default'
:
MyClass myObject1 = MyClass(); // a will be 0, b will be 'Default'
MyClass myObject2 = MyClass(a: 10); // b will be 'Default'
MyClass myObject3 = MyClass(b: 'Hello'); // a will be 0
MyClass myObject4 = MyClass(a: 10, b: 'Hello'); // a will be 10, b will be 'Hello'
匿名方法¶
没有方法名称的方法
///匿名函数
void functionDemo() {
//用变量func接收匿名方法
var func = () {
print('匿名fangfa');
};
func();
//立即执行方法、函数
(() {
print('我是立即执行函数');
})();
}
方法作为参数¶
方法也是一个对象。使用场景:作为参数传递。
void funcDemo() {
var list = [1, 5, 36, 74];
// list.forEach(printElement);
int b = 0;
//匿名方法作为参数的实战。
// 打印结果:
// flutter: 元素1 = 1
// flutter: 元素2 = 5
// flutter: 元素3 = 36
// flutter: 元素4 = 74
forEachDemo(list, (var ele) {
b++;
print('元素$b = $ele');
});
}
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
闭包closure¶
定义在函数里面的函数就是闭包,闭包也是一个对象 闭包的作用:可以访问外部函数的局部变量
void closureDemo() {
var func = funA();
func(); //0
func(); //1
func(); //2
func(); //3
var func2 = funA();
func2(); //0
func2(); //1
func2(); //2
func2(); //3
}
funA() {
int count = 0;
return () => print(count++); //这个匿名函数就是一个闭包,funA函数返回一个闭包
}
类传参¶
class DiscoverCell extends StatefulWidget {
final String title; //不能为空
final String imageName;
final String? subTitle; //可为空
final String? subImageName;
//callback 点击
//回调 接口 外部使用
final void Function()? onTapCallBack;
const DiscoverCell({
Key? key,
required this.title, //title必须有
this.subTitle,
required this.imageName, //imageName必须有
this.subImageName,
this.onTapCallBack, //callback 点击
}) : assert(title != null, 'title不能为空!'),
assert(imageName != null, 'imageName不能为空!'),
super(key: key);
@override
State<DiscoverCell> createState() => _DiscoverCellState();
}