[Flutter跨平台]四、Dart核心1-函数

26 阅读4分钟

1. 函数

1.1. 函数的定义

void main(){
  fnaaa();
  print(fnbbb(100, 200));
}


// 1. 定义函数:无参数无返回值
void fnaaa(){
  print('打印函数中内容');
}

// 2. 定义函数:有参数有返回值
// 需求:定义函数,计算任意两个整数的和,并返回计算结果
int fnbbb(int num1,int num2){
  return num1 + num2;
}

// 3. 函数特点:
// - 函数都有返回值,如果没有明确的指定返回值,那么默认返回null
// - 特点2:返回值类型和参数类型是可以省略的

// 如下特点2:类型都删掉都行,但建议都加上;
 fnccc( num1, num2){
  return num1 + num2;
}

1.2. 函数的参数-必传参数、可选参数

表达式的意思:

  • 有加减乘除符号 & 逻辑运算符的
  • 还有函数调用表达式(某段代码是 调函数,也叫做表达式);
void main(){
  // fnaaa('张三',18);
  fnbbb('张三',18,gender: '女',location : '上海');
}


// 1. 必传参数
// 拓展:${}的大括号里面如果写表达式,得加大括号;如果只有一个参数可以直接写$name;    表达式:有加减乘除符号 & 逻辑运算符的,还有函数调用表达式(调函数);
// void fnaaa(String name,int age){
//   print('姓名:$name,年龄:${age}');
// }


// 2. 可选参数   -其实就是将可选参数放在一个{}里,也就是Map里
// 可选参数 才可以设置默认值(如:String? location = '深圳') (如果形参、入参都不传参数,打印出来就是null),          必传参数 不可以设置默认值
// 可选参数 入参中的顺序是可以无顺序的
void fnbbb(String name,int age,{String? location = '深圳',String? gender = '男'}){
  print('姓名:$name,年龄:${age},地址:${location},的性别:${gender}');
}

1.3. 函数作为对象、参数 去传递

void main(){
  // // 1.函数可以作为对象 传递给 变量
  // var f = fnaaa;
  // Function f = fnaaa;
  // f();


  // // 2.函数可以作为参数 传递给 函数
  // var f = fnTot(fnbbb);//其实这就是回调函数  如下写法是一样的
  // print(f);

  //回调函数写法
  var f = fnTot(() {
    return 111;
  });
  print(f);

}


// // 1. 函数可以作为对象 传递给 变量
// void fnaaa(){
//   print('这是一段文字');
// }


// 2. 函数可以作为参数 传递给 函数
int fnbbb(){
  return 100;
}

int fnTot(Function f){
  return f() + 111;
}

1.4. 匿名函数和箭头函数

匿名函数:就是没有名字的函数

1.4.1. 鸿蒙中的匿名函数:

// 匿名函数作为变量
// 这里的 function(name: string) {return `Hello, ${name}!`;}; 是匿名函数
const greet = function(name: string) {
  return `Hello, ${name}!`;
};

console.log(greet("Alice")); // 输出: Hello, Alice!

// 匿名函数作为回调
// 这里的 function(num) {return num * 2;} 是匿名函数
const numbers = [1, 2, 3];
const doubled = numbers.map(function(num) {
  return num * 2;
});

console.log(doubled); // 输出: [2, 4, 6]

简化写法

// 1. 这里匿名函数是 (name: string) => `Hello, ${name}!`
const greet = (name: string) => `Hello, ${name}!`;
// 2. 这里匿名函数是 num => num * 2
// 这里的return num * 2 可以简写为 num * 2 
const doubled = numbers.map(num => num * 2);

简化写法的第2条这里的return num * 2 可以简写为 num * 2

箭头函数有一种简洁的语法,当函数体只有一条表达式时:

  1. 可以省略 return 关键字。
  2. 表达式的结果会自动作为返回值。

1.4.2. Dart的匿名函数

// 鸿蒙中其实也有匿名函数:是有时候封装时的这种写法  const fn = () => {} ;

void main() {
  // 1. 匿名函数
  // Function f = () {
  //   print('我是一个匿名函数');
  // };
  // f();

  // 2. 匿名函数作为参数 给其他函数去调用
  f1(() {
    print('你好;'); //这里就是入参,入参是一个函数(回调函数)
  });
}

void f1(Function f) {
  f();
}

1.4.3. Dart的箭头函数

// 鸿蒙里面是可以写 () => {}; 是可以写大括号的;但dart里面不能写大括号,后面就写代码就行
void main() {
  // // 箭头函数
  // // dart中的箭头函数后面只能写一个表达式(所以在Dart可以可能用得不多)
  // Function f = () => {print('你好')};//这样写也行
  // Function f = () => print('你好'); //这样写也行
  // var f1 = (a, b) => {a + b}; //这样写不行,这样写输出时{}也会打印出来
  // f();
  // print(f1(1, 2));

  // int a = sum1(1, 2);
  // print(a);

  print(sum2(1, 2));
}

// // 正常的写法
// sum1(a, b) {
//   return a + b;
// }

// 箭头函数的写法
sum2(a, b) => a + b;


// 这样写不行,箭头函数后面只能有一句代码,也就是上面这句写法;
// sum3(a, b) => {
//   return a + b;
// };

1.5. 综合案例

void main() {
  //实现是否全部选中;
  // 准备购物车数据
  List carts = [
    {"count": 2, "price": 10.0, "selected": true},
    {"count": 1, "price": 30.0, "selected": true},
    {"count": 5, "price": 20.0, "selected": false}
  ];

  // bool selRes = isSelected(carts);
  // print('selRes的值:$selRes');

  //2. 第二种写法
  bool selRes = carts.every((item) {
    return item['selected'];
  });

  selRes == false ? print('没全部选中') : print('已经全部选中');
}

// bool isSelected(List cartsEle) {
//   bool res = true;
//   for (var i = 0; i < cartsEle.length; i++) {
//     if (!cartsEle[i]['selected']) {
//       res = false;
//     }
//   }
//   return res;
// }