前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart语言 函数&类

Dart语言 函数&类

原创
作者头像
KID.
修改2024-01-18 16:50:42
1440
修改2024-01-18 16:50:42
举报

Flutter 学习准备 Dart语言 函数 & 类

函数

定义函数

函数定义不需要关键字,函数前的void,int代表函数的返回值类型,void代表了函数无返回值

函数引入非常简单 只需要

import './lib/function.dart'引入路径,入境中的方法就可以使用,不需要做特定的导出。

代码语言:javascript
复制
// 对下方定义参数进行调用
void main(List<String> args) {
  int num = sum(2, 10, 15);
  int num1 = sum(2, 10);
  console(num);
  console(num1);
  // String score = printResult('zhangshan', 23);
  String score = printResult(name: 'zhangshan', score: 68);
  console(score);
  var fn = a();
  fn();
  fn();
  fn();
  fn();
  fn();
  //结果
    //100
    //101
    //102
    //103
    //104
}

// 函数无返回值
void console(value) {
  print(value);
}
// 使用 类型 参数 的形式来定义传入参数类型
int sum(int num1, int num2) {
  return num1 + num2 ;
}

// 被中括号包起来的 参数时可选参数,可以为他赋值,是默认值[int num3 = 0]

// 可选参数
String printResult(String name, dynamic score, [dynamic sex]) {
  // zhangshan ----------- 23 -----------null 不传sex 结果是null
  return '$name ----------- $score -----------$sex';
}

// 参数默认值
int sum(int num1, int num2, [int num3 = 0]) {
  return num1 + num2 + num3;
}

// 命名参数
// 命名参数需要设置默认值,(我理解都是可选参数
// 调用时 printResult(score: 68,name: 'zhangshan')按照传入名称对应,不需要固定顺序
String printResult(
    {String name = 'any', dynamic score = 0, dynamic sex = '男'}) {
  // zhangshan ----------- 23 -----------null 不传sex 结果是null
  return '$name ----------- $score -----------$sex';
}

// 闭包
// 函数的闭包与js相同,就是函数可以访问其他函数作用域中的数据
// 这里在 main函数可以通过 使用 var f1 = a(); f1(); 获取到a函数中的n变量,所以n的值不会被销毁 会一直被保留
Function() a() {
  int n = 99;
  return () {
    n = n + 1;
    print(n);
  };
}

类使用 class 定义

不需要使用 new 关键字来创建类的实例

构造函数

默认构造函数

代码语言:javascript
复制
void main(List<String> args) {
  // 使用js的写法,创建一个类的实例需要用到关键词new,在dart中不需要使用new
  // var student = new Student();
  var student = Student('lisi', '5', 12);
  student.detail();
}

class Student {
  // 构造函数不需要使用constructor。使用与类名相同的方法名即可
  // 类的构造函数必须有初始值,否则会报错 !!!!
  String name = 'zhangsan';
  String grade = '4';
  int age = 10;
  Student(String name, String grade, int age) {
    // 在这里的赋值 需要使用this
    this.name = name;
    this.grade = grade;
    this.age = age;
  }
  // 或者 使用初始化列表的方式(这种方式也不是很使用)
  // String name;
  // String grade;
  // int age;
  // Student(String name, String grade, int age)
  //     : name = "",
  //       grade = "",
  //       age = 0 {
  //   // 在这里的赋值 需要使用this
  //   this.name = name;
  //   this.grade = grade;
  //   this.age = age;
  // }

最多使用的构造函数书写方式 Student(this.name, this.grade, this.age); 这里在定义变量的时候不需要设置初始值

代码语言:javascript
复制
void main(List<String> args) {
 // 使用js的写法,创建一个类的实例需要用到关键词new,在dart中不需要使用new
 // var student = new Student();
 // 定义了一个类后,创建实例可以直接将类型写成我们自己定义的类
 Student student = Student('lisi', '5', 12);
 student.detail();
}
class Student {
 String name;
 String grade;
 int age;
 Student(this.name, this.grade, this.age);
 detail() {
   // 可以使用参数 。this.name/this.grade,也可不不适用this
   // 使用this拼接字符串需要加上{},页面会提示this. is Unnecessary
   print('${this.name} is Grade ${this.grade},${this.age} year old');
   print('$name is Grade $grade,$age year old');
 }
}

多个构造函数

多个构造函数可以用来接受不同个数的参数,来创建实例。这里需要给没有被接受的属性赋初始值。

这里使用了 dart 自带的方法dart:convert中的 jsonEncode来进行 Json 转换。

jsonEncode(data)jsonEncode 转换 class 实例需要在 class 中提供固定的toJson方法 将类中的每一个值放入 Map 中 返回。(ps:自觉麻烦

代码语言:javascript
复制
import 'dart:convert';

void main(List<String> args) {
  Result code = Result.code(200);
  Result msg = Result.msg(500, '系统服务错误');
  Result data = Result.data(200, 'success', {
    'title': 'Tiltle',
    'list': [2, 5, 3]
  });
  // 下列方式直接打印指挥显示Instance of 'Result'
  print(code);
  print(msg);
  print(data);
  // 转换成JSON打印,要想执行这个函数,需要在类里写一个toJson 的方法
  print(jsonEncode(data));
  print(jsonEncode(msg));
  print(jsonEncode(code));
}

class Result {
  // 多个构造函数需要有初始值。类似于不必传的参数
  int code;
  String msg = '';
  Map data = {};
  Result.code(this.code);
  Result.msg(this.code, this.msg);
  Result.data(this.code, this.msg, this.data);
  // 类如果想要被dart:convert 转换成JSon格式一定要有toJson 方法。
  // 将类中的每一个值放入Map中 返回
  Map toJson() {
    Map map = Map();
    // Map map = {}; 这种写法也可以
    if (code != 0) {
      map['code'] = code;
    }
    if (msg.isNotEmpty) {
      map['msg'] = msg;
    }
    if (data.isNotEmpty) {
      map['data'] = data;
    }
    return map;
  }
}

get & set

类中的 get 和 set 类似于提供了一个属性

可以直接通过该关键字定义对应的属性,以便后面访问和修改

get 定义时后是一个对象

set 需要接受一个参数,在使用 set 时不可以使用函数传参 ,要用直接赋值。

..类中属性和方法的链式调用可以使用。不需要写多个语句

代码语言:javascript
复制
void main(List<String> args) {
  // 使用js的写法,创建一个类的实例需要用到关键词new,在dart中不需要使用new
  // var student = new Student();
  Student student = Student('lisi', '5', 12);
  student.detail();
  Result code = Result.code(200);
  Result msg = Result.msg(500, '系统服务错误');
  Result data = Result.data(200, 'success', {
    'title': 'Tiltle',
    'list': [2, 5, 3]
  });
  // 转换成JSON打印,要想执行这个函数,需要在类里写一个toJson 的方法
  print(jsonEncode(data));
  print(jsonEncode(msg));
  print(jsonEncode(code));
  //  set 的调用方法时直接赋值。
  msg.msgValue = '请求成功';
  print(msg.mes);
  // 如果是类中的属性及方法的链式调用 可以使用 '..'
  msg
    ..msgValue = '请求失败'
    ..getContent();
}

class Result {
  // 多个构造函数需要有初始值。类似于不必传的参数
  int code;
  String msg = '';
  Map data = {};
  Result.code(this.code);
  Result.msg(this.code, this.msg);
  Result.data(this.code, this.msg, this.data);

  // get 类似于属性的调用,可以直接获取对应数据
  get mes {
    return 'code: $code, $msg';
  }

  // set
  set msgValue(value) {
    msg = value;
  }

  getContent() {
    print('code: $code, msg: $msg');
  }

私有!

预定 在变量或者方法等内容钱加 "_"代表时私有的内容,在外面文件不可以访问私有属性。

如果类在当前页面定义,在当前页面方法中可以 获取到私有属性。

如果该类被其他文件引入,则私有属性不可以被访问,访问会报错

/class.dart

代码语言:javascript
复制
class Result {
  // 多个构造函数需要有初始值。类似于不必传的参数
  int code;
  String msg = '';
  Map _data = {};
  Result.data(this.code, this.msg, this._data);
}

/use.dart

代码语言:javascript
复制
import './class.dart';
void main(List<String> args) {
  Result data = Result.data(200, 'success', {
    'list': [1, 2],
    'title': 'xxee'
  });
  print(data._data); // 项目运行代码检查都会报错
}

static

使用static定义的属性是静态属性,定义的方法是静态的方法。

使用 static 定义的方法可以直接通过类名加属性调用,不需要创建实例。

静态的方法与属性都只能访问静态数据,不可以使用类中定义的其他属性值。会报错。

代码语言:javascript
复制
void main(List<String> args) {
  print(Result.resultErrorCode);
  print(Result.resultSuccessCode);
  print(Result.resultSuccess());
  print(Result.resultError());
}

class Result {
  // 多个构造函数需要有初始值。类似于不必传的参数
  int code;
  String msg = '';
  Map _data = {};
  Result.code(this.code);
  Result.msg(this.code, this.msg);
  Result.data(this.code, this.msg, this._data);
  // static 静态属性 可以直接通过类名访问的属性,不需要实例化
  static int resultSuccessCode = 200;
  static String resultSuccessMsg = 'success';
  static int resultErrorCode = 500;
  static String resultErrorMsg = 'Systom error';
  // 静态方法
  static String resultSuccess() {
    return jsonEncode(Result.msg(resultSuccessCode, resultSuccessMsg));
  }

  static String resultError() =>
      jsonEncode(Result.msg(resultErrorCode, resultErrorMsg));


  // 类如果想要被dart:convert 转换成JSon格式一定要有toJson 方法。
  // 将类中的每一个值放入Map中 返回
  Map toJson() {
    Map map = Map();
    // Map map = {}; 这种写法也可以
    if (code != 0) {
      map['code'] = code;
    }
    if (msg.isNotEmpty) {
      map['msg'] = msg;
    }
    if (_data.isNotEmpty) {
      map['data'] = _data;
    }
    return map;
  }
}

继承

继承使用的是 extends 关键字

class Group extends Student, 继承的类需要有自己的构造函数,再构造函数中通过super来继承父级的属性

继承后子类可以直接调用父类的方法,也可以重写父类的方法。

@override重写父类方法,可以省略

代码语言:javascript
复制
void main(List<String> args) {
  // 使用js的写法,创建一个类的实例需要用到关键词new,在dart中不需要使用new
  // var student = new Student();
  Student student = Student('lisi', '5', 12);
  student.detail();
  Group group = Group('wangwu', '2', 8, '无敌');
  group.detail();
  group.group();
  group.detail();
  print(group is Group);
  print(group is Student);
}

class Student {
  String name;
  String grade;
  int age;
  Student(this.name, this.grade, this.age);
  detail() {
    // 可以使用参数 。this.name/this.grade,也可不不适用this
    // 使用this拼接字符串需要加上{},页面会提示this. is Unnecessary
    print('${this.name} is Grade ${this.grade},${this.age} year old');
    print('$name is Grade $grade,$age year old');
  }
}

// 写法还是要注意一下 与js不同
class Group extends Student {
  String groupStage;
  // 构造函数
  Group(String name, String grade, int age, this.groupStage)
      : super(name, grade, age);

  group() {
    print('$name is $groupStage');
  }

  @override
  detail() {
    print('$name is Grade $grade,$age year old,is $groupStage');
  }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flutter 学习准备 Dart语言 函数 & 类
    • 函数
      • 定义函数
      • 构造函数
      • 默认构造函数
      • 多个构造函数
      • get & set
      • 私有!
      • static
      • 继承
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档