函数定义不需要关键字,函数前的void
,int
代表函数的返回值类型,void
代表了函数无返回值
函数引入非常简单 只需要
import './lib/function.dart'
引入路径,入境中的方法就可以使用,不需要做特定的导出。
// 对下方定义参数进行调用
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 关键字来创建类的实例
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);
这里在定义变量的时候不需要设置初始值
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:自觉麻烦
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 需要接受一个参数,在使用 set 时不可以使用函数传参 ,要用直接赋值。
..
类中属性和方法的链式调用可以使用。不需要写多个语句
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
class Result {
// 多个构造函数需要有初始值。类似于不必传的参数
int code;
String msg = '';
Map _data = {};
Result.data(this.code, this.msg, this._data);
}
/use.dart
import './class.dart';
void main(List<String> args) {
Result data = Result.data(200, 'success', {
'list': [1, 2],
'title': 'xxee'
});
print(data._data); // 项目运行代码检查都会报错
}
使用static
定义的属性是静态属性,定义的方法是静态的方法。
使用 static 定义的方法可以直接通过类名加属性调用,不需要创建实例。
静态的方法与属性都只能访问静态数据,不可以使用类中定义的其他属性值。会报错。
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
重写父类方法,可以省略
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 删除。