跳转至

方法

完整定义

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 的实例时,你必须提供 ab 参数:

MyClass myObject = MyClass(a: 10, b: 'Hello');

如果你不提供所有的必需参数,Dart 编译器将会报错。

另外,如果你想要命名参数是可选的,但是当它们被传递时必须不为 null,你可以为它们提供一个默认值:

class MyClass {
  int a;
  String b;

  MyClass({this.a = 0, this.b = 'Default'});
}

在这个例子中,如果你创建一个 MyClass 的实例时没有提供 ab,它们会分别使用默认值 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();
}