dart 语言学习日记
dart 语言学习日记
前言
接着lazyvim折腾日记(4) 上文已经描述如何安装 flutter 及其在 flutter 在 nvim 下的使用
下一步的学习思路是先从概念本身学起,再从实际项目中进行实践
本文基于以下资料进行学习
learn x in y minutes/dart
dart.dev
主要是围绕 learn x in y minutes 的 dart 章节进行学习, 下面内容以补充解释该章节为主
重点注释
- 在 dart 里,所有内容都是对象,每一个声明都是 null 的实例并且 null 本身也是一个对象
- 在 dart 里,有三种打注释的方法
- 单行注释:
// - 多行注释:
/**/ - 代码文档注释:
///
- 四种变量声明体系
- const 常量
- final 只能赋值一次的常量
- var 可变量,但是其数据类型不可变
- dynamic 可变量,其数据类型可变
- 函数与方法的定义方法是一样的,可以使用箭头函数定义, main() 函数是 dart 项目的整体入口
- dart 的函数定义支持 泛用 类型
T类型多数用于 类 及 初始类型E类型多数用于 List / Set / IterableK,V类型多数用于key Value的键值对(map)类型
List/Mpas/LinkedList是Iterable<E>的子类型,其定义方法为
()vi dIterable[]List{}Map<K,V>
- int double num 都是 dart 所支持的数字类型
- 其中,num 是 int 与 double 的父类
- dart 支持 try catch finally 等关键字
- 单双引号在 String 中其实并没有区别
- 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}'");
}

浙公网安备 33010602011771号