dart 语言学习日记

dart 语言学习日记

前言

接着lazyvim折腾日记(4) 上文已经描述如何安装 flutter 及其在 flutter 在 nvim 下的使用

下一步的学习思路是先从概念本身学起,再从实际项目中进行实践

本文基于以下资料进行学习

learn x in y minutes/dart
dart.dev

主要是围绕 learn x in y minutes 的 dart 章节进行学习, 下面内容以补充解释该章节为主

重点注释

  1. 在 dart 里,所有内容都是对象,每一个声明都是 null 的实例并且 null 本身也是一个对象
  2. 在 dart 里,有三种打注释的方法
  • 单行注释: //
  • 多行注释: /**/
  • 代码文档注释: ///
  1. 四种变量声明体系
  • const 常量
  • final 只能赋值一次的常量
  • var 可变量,但是其数据类型不可变
  • dynamic 可变量,其数据类型可变
  1. 函数与方法的定义方法是一样的,可以使用箭头函数定义, main() 函数是 dart 项目的整体入口
  2. dart 的函数定义支持 泛用 类型
  • T 类型多数用于 初始类型
  • E 类型多数用于 List / Set / Iterable
  • K,V 类型多数用于 key Value 的键值对( map )类型
  1. List / Mpas / LinkedListIterable<E> 的子类型,其定义方法为
  • () vi dIterable
  • [] List
  • {} Map<K,V>
  1. int double num 都是 dart 所支持的数字类型
  • 其中,num 是 int 与 double 的父类
  1. dart 支持 try catch finally 等关键字
  2. 单双引号在 String 中其实并没有区别
  3. dart 里的类可以具备继承关系

一些需要注意的内容

class Example21 {
  List<String> _names;
  Example21() {
    _names = ["a", "b"];
  }
  List<String> get names => _names;
  set names(List<String> list) {
    _names = list;
  }

  int get length => _names.length;
// 在此处定义了 length 成员,该成员是以计算方法定义的,与 name 成员绑定
  void add(String name) {
    _names.add(name);
  }
}

void example21() {
  Example21 o = new Example21();
  o.add("c");
// 此处调用了 add 方法
  print("Example21 names '${o.names}' and length '${o.length}'");
// 此处调用了 name 与 length 的 get 方法
  o.names = ["d", "e"];
// 此处调用了 name 的 set 方法,使得 names = ["d","e"] 替换了之前的 ["a","b","c"]
  print("Example21 names '${o.names}' and length '${o.length}'");
}
example16() {
  var sb = new StringBuffer(), a = ["a", "b", "c", "d"], e;
  for (e in a) {
    sb.write(e);
  }
  print("Example16 dynamic string created with "
      "StringBuffer '${sb.toString()}'");
  print("Example16 join string array '${a.join()}'");
}
// 这里表示两种组成字符串的方法,一种是使用 StringBuffer() 类型,另外一种是使用列表
// 而变量 e 则是一个动态类型,由于其没有初始化,所以其初始值是 null , 在循环里作为 iterable 类型获取 a 的元素
// 在最后 e 的值为 "d"
example11() {
  var i = 1 + 320, d = 3.2 + 0.01;
  final num myFinalNumDouble = 2.2;
  final num myFinalNumInt = 2;
  final int myFinalInt = 1;
  final double myFinalDouble = 0.1;
  num myNumDouble = 2.2;
  num myNumInt = 2;
  int myInt = 1;
  double myDouble = 0; // Dart will add decimal prefix, becomes 0.0;
  myNumDouble = myFinalInt; // valid
  myNumDouble = myFinalDouble; // valid
  myNumDouble = myFinalNumInt; // valid
// dart 支持向上转型,int double final 都可以向上转型为 num

  myNumInt = myFinalInt; // valid
  myNumInt = myFinalDouble; // valid
  myNumInt = myFinalNumDouble; // valid

  myInt = myNumDouble; // error
  myInt = myFinalDouble; // error
// double 与 int 类型不可以互相转换
  myInt = myFinalNumInt; // valid
// 在这段中 myInt 只是获取了 myFinalNumInt 的值,myInt 仍然保持其可变性

  myDouble = myFinalInt; // error
  myDouble = myFinalNumInt; // error
// 如上文所说,double 与 int 类型不可以互相转换
  myDouble = myFinalNumDouble; // valid

  print("Example11 int ${i}");
  print("Example11 double ${d}");

}
  /// dynamic typed null can not be convert to bool
  var b; /// b is dynamic type
  b = "abc";
  try {
    if (b) {
      print("true, b is $b");
    } else {
      print("false, b is $b");
    }
  } catch (e) {
    print("error, b is $b"); /// this could be run but got error
  }

// 动态类型不可以直接转换为 boolean 类型,也就是上述代码会报错
class Example23A {}

class Example23Utils {
  addTwo(n1, n2) {
    return n1 + n2;
  }
}
/// Example23B 与 Example23A 的关系为继承关系
/// Example23B 与 Example23Utils 的关系为关联关系
/// 在 dart 中,只能够继承一个类,但是可以 with 多个类
class Example23B extends Example23A with Example23Utils {
  addThree(n1, n2, n3) {
    return addTwo(n1, n2) + n3;
  }
}

/// 如下面代码所示,Example23B 可以使用 Example23Utils 的所有方法
example23() {
  var o = new Example23B(), r1 = o.addThree(1, 2, 3), r2 = o.addTwo(1, 2);
  print("Example23 addThree(1, 2, 3) results in '${r1}'");
  print("Example23 addTwo(1, 2) results in '${r2}'");
}
posted @ 2025-02-11 01:53  五花肉炒河粉  阅读(9)  评论(0)    收藏  举报