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

Dart语言 函数&类

原创
作者头像
KID.
修改于 2024-01-18 08:50:42
修改于 2024-01-18 08:50:42
23400
代码可运行
举报
运行总次数:0
代码可运行

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

函数

定义函数

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

函数引入非常简单 只需要

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 对下方定义参数进行调用
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
class Result {
  // 多个构造函数需要有初始值。类似于不必传的参数
  int code;
  String msg = '';
  Map _data = {};
  Result.data(this.code, this.msg, this._data);
}

/use.dart

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dart学习 抽象类/泛型类/接口/混入
抽象类是对本质相同内容类定义一个标准.有相同本质要实现不同功能的子类可以继承这个类,需要实现其中定义的抽象方法
KID.
2024/01/30
3510
Dart 知识点 - 构造方法
上一篇文章Dart 知识点 - 面向对象基础中,我们已经初步了解了类的构造方法,本文,我们详细来学习一下构造函数。
Jimmy_is_jimmy
2022/09/19
4640
Flutter3 Dio5 接口请求工具类封装
写在前面:我也是拿来主义,看到@老猫-Leo的【Flutter-Dart基于 Dio 的 HTTP 请求工具类】,封装的蛮好,但是由于我用的是flutter3,拿来后做了一些改动。我把我改动后的封装分享出来,flutter3拿来可用。本文已征得原作者同意,感谢@老猫-Leo的分享。
limbo
2024/01/11
2.5K1
初识SpringBoot Web开发
虽说前端的h5和js都可以完成表单的字段验证,但是这只能是防止一些小白、误操作而已。如果是一些别有用心的人,是很容易越过这些前端验证的,有句话就是说永远不要相信客户端传递过来的数据。所以前端验证之后,后端也需要再次进行表单字段的验证,以确保数据到后端后是正确的、符合规范的。本节就简单介绍一下,在SpringBoot的时候如何进行表单验证。
端碗吹水
2020/09/23
4660
初识SpringBoot Web开发
dart系列之:dart语言中的函数
函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分。dart中的函数和java中的函数有什么区别呢?
程序那些事
2021/11/10
9000
dart系列之:dart语言中的函数
dart系列之:还在为编码解码而烦恼吗?用dart试试
在我们日常使用的数据格式中json应该是最为通用的一个。很多时候,我们需要把一个对象转换成为JSON的格式,也可以说需要把对象编码为JSON。
程序那些事
2021/12/06
8340
dart系列之:还在为编码解码而烦恼吗?用dart试试
LayUI树形表格treetable使用详解
LayUI是现在比较流行的一款前端框架,也有很多人基于LayUI开发了很多不错的组件,比如treetable树形表格。因为treetable是第三方基于LayUI开发的,所以需要先用Layui引入一下文件。
全栈程序员站长
2022/07/01
9.3K1
LayUI树形表格treetable使用详解
Dart入门
要学Flutter必先学Dart,Dart和Java的语法很像,学过Java的人很快就能入手
用户3112896
2019/12/27
8420
Dart语法基础系列七《类》
如果该类生成的对象是固定不变的, 那么就可以把这些对象定义为编译时常量。 为此,需要定义一个 const 构造函数, 并且声明所有实例变量为 final。
星宇大前端
2021/11/10
3920
上手指南 | Dart,随用随查
dynamic:该类型具有所有可能的属性和方法,一个变量被 dynamic 修饰,相当于告诉系统,我知道这个类型到底是什么。使用后再编译时不会推断数据的类型,但是运行时会推断。
345
2022/02/11
1.9K0
上手指南 | Dart,随用随查
Flutter Json渐进式解析(下)
前面几种Json数据格式最外层都是JsonObject,而下面这种,最外层就是一个JsonArray,数据如下所示。
用户1907613
2019/05/07
2.6K0
【Dart 专题】Factory 工厂构造函数
和尚学习 Flutter 有一段时间,虽可以应用基本的 Dart 语法,但对于一些特殊的语法还是很陌生,和尚准备开一个小的【Dart 专题】记录一些日常用的 Dart 语法及相关应用;
阿策小和尚
2020/11/11
1.5K0
【Dart 专题】Factory 工厂构造函数
Flutter-Dart基于 Dio 的 HTTP 请求工具类
Flutter 基于 Dio 封装的一个 HTTP 请求工具类(XHttp),使用单例方便全局请求管理与使用。 包括请求拦截、响应拦截、错误拦截、请求 Hooks、日志输出、取消请求、取消重复请求、设置白名单、权限管控、基础请求等等功能。
老猫-Leo
2023/12/11
1.1K2
Flutter之Json数据解析
Flutter 开发中,Json 数据解析一直是一个痛点,特别是对于从 iOS、Android 或者 Java 转过来的开发者来说尤为明显,在上述平台上开发者习惯了将 Json 数据解析为对象实体然后进行使用,而在 Flutter 上要做到这一步则相对比较麻烦。
loongwind
2022/09/27
12.4K0
Flutter之Json数据解析
DartVM服务器开发(第十七天)--Jaguar_websocket结合Flutter搭建简单聊天室
我们这里定义了一个ChatMessageData,如果你想需要更多字段,可以再添加
rhyme_lph
2018/09/13
2.1K0
DartVM服务器开发(第十七天)--Jaguar_websocket结合Flutter搭建简单聊天室
Dart的语法详解系列篇(二)-- 类与函数八、Dart的类与函数
上一篇主要讲了数据类型、运算符、流程语句等,由于文字太多,我就把剩下的内容分开写一篇文章。 这一篇我们讲Dart的类与函数,内容较多,希望大家可以耐心看完。我也是花了很长时间研究的。喜欢的九点个赞,打个赏吧。 感谢大家支持。
AWeiLoveAndroid
2019/01/03
3.1K0
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
JSON 格式比较简单的话 , 使用自带的 dart:convert 包 , 手动进行 JSON 的序列化与反序列化的操作即可 ;
韩曙亮
2023/03/29
3K0
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
Dart基础知识
emmmm….很明显,现在知道 Dart 语言的人大部分都是因为 Flutter,这与它的目标成为下一代结构化Web开发语言好像有点偏差。(不过在Flutter 1.5 发布的时候发布了 Flutter for web)
Flutter笔记
2019/07/24
1K0
Dart基础知识
Flutter 入门指北之 Dart
原文:https://www.jianshu.com/p/8ddb16902ce6
陈宇明
2020/12/16
9190
Dart 学习基础篇(数据类型&对应方法
可以通过var 来定义变量,他会自动匹配变量的数据类型,也可以使用 对应的 String , int 来指定定义的类型。
KID.
2024/01/17
2950
相关推荐
Dart学习 抽象类/泛型类/接口/混入
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验