> 文章列表 > Dart入门(2)

Dart入门(2)

Dart入门(2)

Dart入门(2)

转义

void main(){//  \\":表示双引号(")。// \\':表示单引号(')。// \\\\:表示反斜杠(\\)本身。// \\n:表示换行符。// \\t:制表符// 如果我想输出\\n字符串,而不是被解析为换行// 只需要在字符串引号前面添加r即可var txt = r"我\\n她";print(txt);}

编码类型

void main() {// 编码(Runes)类型的声明// 使用\\u转义符声明Runes code1 = new Runes("\\u{1f605}\\u{1f60e}");// 输出对于的明文print(String.fromCharCodes(code1)); // 😅😎
}

函数

// 普通参数
int add(int x, int y){return x + y;
}// 默认参数
// 即 : 用{}圈起来的键值对,可以类比Python的kwargs
void getHist(String title, {String Python = '14.51%',String Java = '13.23%',String Dart = "50%"})
{print(title);print('Python占比 : ${Python}');print('Java占比 : ${Java}');print('Dart占比 : ${Dart}');
}// 可选参数
void scores([double? math, double chinese = 98.5]){print('Chinese Score : ${chinese}');print('Math Score : ${math}');
}// 命名参数
// 使用{}把参数名字围起来,并且使用required在参数面前告诉编译器这是一个命名参数
// 或者使用?进行防空判断
void getInfo({String? name, required int year}){print('${name} is ${year}-old .');
}void main(){print(add(5, 15));getHist('--------------四月份TIOBE编程语言占比统计---------------', Dart: '0.38%');scores(145.5);getInfo(name: "Lily", year: 22);
}

类核心学习

// 抽象类提供接口
abstract class Animal{void action();
}// 实体类
// implements用于拓展抽象类接口
class Firefly implements Animal{String? name;void action(){print('Firefly can fly');}
}class Worm {// 保护属性String? _type;
}class Size {// 私有属性String ?  __size;
}// 类继承
// 使用extends + 父类
// 使用extend A with B, C ...来多继承// 重载 (Overloading):Dart中没有
// 重载是指在同一个类中可以定义多个具有相同名称但参数列表不同的方法
// 这样在调用这个方法时,编译器会根据参数的个数、类型或顺序等不同来自动选择正确的方法进行调用。
// 在Dart中,方法的重载是不被支持的,因为Dart是一门强类型语言,
// 不允许在同一个类中定义具有相同名称但参数列表不同的方法。
//
//重写 (Overriding):Dart支持,且不建议直接重写,而是使用override声明
//重写是指在子类中重新定义一个与父类中同名、同参数列表的方法,从而覆盖(替代)父类中的方法实现。
// 子类可以通过重写来修改或扩展父类的行为,使其符合子类的需求。
// 在Dart中,子类可以通过使用 @override 注解来重写父类的方法,从而在编译时进行验证,确保方法的重写是正确的。
// 在Dart中,如果一个类继承自另一个类,你可以直接在子类中重写父类的方法,而不需要使用override关键字。
// 但是,如果你在子类中重写了父类的方法,且没有使用override关键字,
// Dart会给出一个警告,以提醒你可能意外地重写了父类的方法。
// 在Dart中,使用@override注解是一种良好的编码实践,因为它可以让代码更加清晰和易于理解。
// @override注解告诉编译器,你有意地要重写父类的方法,而不是在子类中意外地创建了一个新的方法。
class A_special_firefly extends Firefly with Worm, Size{String ? name = 'A seltsam firefly';String ? __size = 'tiny';String ? _type = 'cute';// 构造函数A_special_firefly(this.name, this._type, this.__size);void action() {// TODO: implement actionsuper.action(); // 此句话是继承原有的功能,然后我在下面写拓展,同Python类重写继承print('Firefly but a fireworm ? ');}List<String> getInfo(){return ["Her name is ${name}", "She is so ${_type}", "Is she ${__size}"];}
}main(){var wy = A_special_firefly("A_seltsam_firefly", 'cute', 'tiny');wy.action();wy.getInfo().forEach((element) { print(element);});
}

泛型

// 类
// 提供了一个存储两个元素的向量类
class Vector<T> {T _a, _b;List<T> _list = [];Vector(this._a, this._b) {_list.add(_a);_list.add(_b);}T operator[] (int i) {return _list[i];}
}// 函数泛型
List<T> getElementName<T>(T a, T b){return [a, b];
}void main() {var vec = Vector('a', 5);print('元素列表 : ${getElementName(vec._a, vec._b)}');
}

简单的包调用

文件结构
| - Mycomplex.dart  
|
| - MyMath.dart  
|
| - main.dart  

Mycomplex.dart

// 定义一个复数
import 'dart:math';class Complex<T> {T _a, _b;List<T> _list = [];Complex(this._a, this._b) {_list.add(_a);_list.add(_b);}T operator[] (int i) {return _list[i];}
}// 复数求模
num getMod(num a, num b) {return pow((a * a + b * b), 0.5);
}

MyMath.dart

// 简单的取余
int rest(num a, num b){return (a % b).toInt();
}// 阶乘
int fak(int n){if (n <= 2) { return n ; }else {return fak(-1 + n) * n;}
}

main.dart

// 调用整个包
import "Mycomplex.dart";// 调用包里面某个函数
// 类似Python里面的from pkgname import func or class 功能
import 'MyMath.dart' show fak;void main(){var complex = Complex(1.5, 2);print("实数部 : ${complex[0]}");print('取模 : ${getMod(complex[0], complex[1])}');print("8的阶乘 : ${fak(8)}");
}

库管理

  • 我有如下的项目结构
文件结构
| - pkg-mamagers.dart  
|
| - MyPkgs
|
| > > - pkg1.dart  
| > > - pkg2.dart
  • 如果我想在pkg-mamagers.dart中使用MyPkgs中的两个文件,我可以在这两个文件中声明,library lib_name;来把这些包放入同一个命名空间从而构成一个库

Gitee链接 : https://gitee.com/PythonnotJava/NoteBooks/tree/master/Dart-Lang-notebooks/dart-base2
文章链接 : https://www.robot-shadow.cn/src/h5/other/Dart%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%EF%BC%882%EF%BC%89.html