Dart进阶

Dart 是一种用于构建应用程序的编程语言,它具有许多语法糖(Syntactic Sugar)特性,这些特性能够简化代码并提高开发效率。以下是 Dart 中一些常见的语法糖特性:

  • 级联操作符(Cascade Notation):Dart 允许使用级联操作符 … 连续调用对象的多个方法,而不需要反复引用同一个对象,例如:myObject…method1()…method2()…method3();。
class Dog_kik{
  void take_own_action(){
    print('汪汪汪~~~');
  }
  void take_action(){
    print('汪汪汪');
  }
  void act(){
    print('Animal action');
  }
}

void main(){
  Dog_kik kiki = Dog_kik();
  kiki..take_own_action()..take_action()..act();
}
  • 箭头函数:Dart 支持使用箭头函数 => 定义单行的匿名函数,这样可以简化函数的定义和使用,例如:(int a, int b) => a + b,这个箭头函数实现了两个整数相加的功能,相当于版本的return。
int power(int number) => number * number;
void main() { print("11x11 =  ${power(11)}"); }
  • 扩展方法(Extension Methods):Dart 允许使用扩展方法为现有的类添加新的方法,而无需修改类的定义,这种方式可以为已有的类添加功能,例如:extension StringPrint on String { void printString() { print(this); } },这里为 String 类型添加了一个名为 printString 的方法,可以直接在字符串对象上调用该方法。
class Dog {
  void action(){
    print('汪汪汪');
  }
}

// NewAction随便取名字,它更像一个注释,用来阐述你的方法用于干什么
extension NewAction on Dog {
  String getName(String name) => "the dog named $name";
}

main (){
  Dog dog_kiki = Dog();
  dog_kiki.action();
  print(dog_kiki.getName('kiki'));
}
  • 类型别名(Type Alias):Dart 支持使用 typedef 关键字创建自定义的类型别名,可以将复杂的类型定义简化为一个简洁的名称,例如:typedef void MyCallback(int value);,这里创建了一个名为 MyCallback 的类型别名,表示接受一个 int 类型参数且返回 void 的回调函数类型。
class Dog {
  void action(){
    print('汪汪汪');
  }
}

typedef Dog2 = Dog;

main (){
  Dog2 dog_kiki = Dog2();
  dog_kiki.action();
}
  • 空安全(Null Safety):Dart 2.12+ 引入了空安全特性,它可以帮助开发者在编译时检测和预防空指针异常,包括强制非空声明、可空类型、空安全运算符(?、!)等,从而减少空指针异常的风险并简化代码。
main(){
  var number; print(number); // null

  // 使用空安全操作符 "?" 来访问可空类型的属性或调用方法
  String ? str;
  print(str);     // null
  int ? len_str = str?.length;
  print(len_str);  // null

  // 使用空安全操作符 "!" 来断言可空类型不为 null,并访问其属性或调用方法
  int another_len = str!.length;
  print(another_len);
}
  • 集合(Collection)相关的语法糖:Dart 提供了丰富的集合相关的语法糖,例如集合初始化列表、集合推导式、扩展操作符(…)等,这些语法糖可以简化集合的创建、操作和转换。
void main(){
  // 用以下方式建立一个列表
  var list1 = [1, 2, 3];
  var list2 = [for (int i=0;i<5;i++) i];  // 很像python的列表语法糖
  var list3 = List.generate(3, (index) => index * 2);  // 生成3个元素,类似Python的生成器写法,请看下面Python的生成器写法
  // 优先备注 : 这是Dart的匿名函数的一种写法,(int parameter) => parameter * 2;
  // 这种写法更像是Python中的lambda匿名函数
  // Python生成器写法
  // def func():
  //   for i in range(5):
  //     yield i

  // 列表合并
  var list4 = [...list1, ...list2];
  // 注意,列表合并与下面不同
  var list5 = [list1, list2];

  // 列表复制
  var list6 = [...list1];
  print(list1);
  print(list2);
  print(list3);
  print(list4);
  print(list5);
  print(list6);

  // 创建集合、字典的语法糖
  var set1 = { for (var i=0;i<10;i++) if (i % 2 == 0) i};
  var map1 = {for (var i=0;i<5;i++) i : i * 2 };
  print(set1);
  print(map1);
  // 拓展字典项目
  map1 = {...map1, 6 : 12};
  print(map1);
}
  • forEach遍历功能
void main(){
  var list7 = [1, 2, 3, 0, 1, 2, 3, 4];
    list7.forEach((element) {
    print( element * 2);
    });
// 相当于
for (var i in list7) {print(i * 2);};
}
  • 多继承
class ClassA {
  void methodA() {
    print('methodA');
  }
}

class ClassB {
  void methodB() {
    print('methodB');
  }
}

class ClassC with ClassA, ClassB{
  void methodC() {
    print('methodC');
  }
}

void main() {
  var example = ClassC();
  example.methodA();
  example.methodB();
  example.methodC();
}
  • 紧凑的构造函数语法:Dart 允许在构造函数中通过参数直接对实例字段进行初始化,例如 class MyClass { int x; MyClass(this.x); },这种方式可以简化构造函数的定义和使用。
class A_List {
  int __len;
  A_List(this.__len);   // 替代了AList(int __len) {__len = __len;}的繁琐
  void getLen() { print("Object len is $__len") ; }
}

void main(){
  A_List alist = A_List(11);
  alist.getLen();
}
  • 可选的命名构造函数:Dart 支持在类中定义多个命名构造函数,并通过不同的命名来进行区分,从而方便地创建不同形式的对象实例,例如 class MyClass { MyClass(); MyClass.fromValue(int value); },这里定义了一个默认构造函数和一个名为 fromValue 的命名构造函数。
class Dog {
  int age = 0;
  Dog(){
    print('这是一条狗');
  }
  Dog.fromValue(this.age) {
    print("这是一条年龄是的$age的狗");
  }
}

main(){
  Dog kiki = Dog();
  Dog poky = Dog.fromValue(5);
}
  • 局部函数:Dart 允许在函数内部定义局部函数,这样可以将一些辅助函数定义在主函数内部,避免了污染全局命名空间,也可以使得辅助函数在主函数内部更加集中和易于访问。
main() {
  int count = 0;
  void help_U_count(){
    ++count;
    print("当前计数$count次");
  }
  help_U_count();
  help_U_count();
  help_U_count()  ;
}
  • 函数递归
// 斐波那契数列
int fib(var n){
  if (!(n > 2)){  // 这里测试一下取反,故意写麻烦
    return n;
  }
  else {
    return fib(n - 1) + fib(n - 2);
  }
}

int main(){
  for (int i=1;i<21;i++){
    print("第$i个斐波那契数为${fib(i)}");
  }
  return 0;
}
  • 闭包
// 闭包
Function outer(){
  int insider(int number){
    return number * number;
  }
  return insider;
}

Function function1(){
  Function function2(int number1) {
    int function3(int number2){
      return number1 * number2;
    }
    return function3;
  }
  return function2;
}

void main(){
  var func = outer();
  print('调用内置函数 : ${func(12)}');
  print('还可以这么使用 : ${outer()(12)}');

  // 试试这个三层嵌套
  // 计算4x6
  print(function1()(4)(6));
}
  • 字符串的多行模式:Dart 允许使用三个单引号 ‘’’ 或三个双引号 “”" 来定义多行字符串,这样可以在字符串中包含换行符和缩进,使得多行字符串的书写更加方便。
var str = """
   字符串的多行模式:Dart 允许使用三个单引号  
   或三个双引号 来定义多行字符串,这样可以在字符串中包含换行符和缩进,
   使得多行字符串的书写更加方便
""";

var str2 = '''
   字符串的多行模式:Dart 允许使用三个单引号   或三个双引号 来定义多行字符串,这样可以在字符串中包含换行符和缩进,使得多行字符串的书写更加方便
''';
  • Mixins:Dart 支持使用 mixin 关键字创建 Mixin 类,它可以作为多继承的替代方案,用于在多个类之间共享代码,从而避免了传统多继承可能带来的问题,例如钻石继承等。
mixin Record_Message {
  void record(String type){
    print("Message : $type");
  }
}

void record(String type){
  print("Message : $type");
}

class A with Record_Message {
  void getId(int id){
    record("id => $id");
  }
}

class B with Record_Message {
  void getCount(int count){
    record('count => $count');
  }
}

void main(){
  A a = A();
  var b = B() ;
  a.getId(11);
  b.getCount(1323);
}
  • 重载运算符
// 复数
class Complex {
  int a, b;
  var li = [];
  Complex(this.a, this.b){
    li.add(this.a);
    li.add(this.b);
  }
  // 重载[],使得允许索引访问
  int operator[](int index) {
    return li[index];
  }
}

void main(){
  Complex com = Complex(4, 6);
  print(com[1]);
}

  • dart中异常与报错处理,以及自定义异常或者错误
// 自定义报错类
class MyError{
  String error;
  MyError(this.error){
    print("Error : $error");
  }
}

void main(){
  // 捕捉
  try{
    assert (1 > 11);
  }
  catch (e){
    print("Catch the Error : $e");
  }
  finally{
    print("无论是对是错,都会执行");
  }
  // 自定义
  // 比如说dart中1/0会得到Infinitely,但是我不希望这样,而是报错,0不能作为分母
  if ((1 / 0) == double.infinity) {
    throw MyError("0不能作为分母");
  }
  else {
    print('....');
  }
}
  • 在 Dart 中,implements 关键字用于实现接口。接口是一种描述类应该具有哪些成员(方法、属性等)的约定,类可以通过实现接口来确保自己具有指定的成员。使用 implements 关键字可以在类中实现一个或多个接口。
abstract class Animal {
  void action();
}

class Horse implements Animal{
  void action(){
    print('马会跑');
  }
}

class Bird implements Animal{
  void action(){
    print('鸟会飞');
  }
}

class Fish implements Animal {
  void action(){
    print('鱼在水里游');
  }
}

main()    {
  Horse h = Horse();
  Fish f = Fish();
  Bird b = Bird();
  h.action();
  f.action();
  b.action();
}
  • 生成器,生成器函数提供了一种延迟计算、节省内存、简化代码和支持无限序列等优点,使得在处理大数据集、复杂计算或需要按需生成值的情况下,生成器函数成为一种非常有用的编程工具。
Iterable yieldNumber(int len) sync* {  // Iterable是可迭代的类型,sync*来声明这是一个生成器函数
  for (int i=0;i<len;i++) {
    yield i * 2;
  }
}

void main(){
  for (int i in yieldNumber(12)){
    print(i);
  }
}

源代码下载链接 : https://gitee.com/PythonnotJava/NoteBooks/tree/master/dart-tutorial
文章链接 :https://www.robot-shadow.cn/src/h5/other/Dart%E9%AB%98%E7%BA%A7%E6%95%99%E7%A8%8B.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

若您有别的建议,请在评论区留言

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值