1.Dart语言的基础
Dart
致力于打造高质量的跨屏体验
- 针对客户端开发优化
 - 丰富强大的框架
 - 灵活的工具
 
void main(){
	var msg ="hello word";
  print(msg);
  // print("这是一堆字符串 $msg")
  // print("这是一堆字符串 ${msg}ccssd")
}
- 一切变量都是对象,包括数字、函数,null
 - 对象是类的实例,所有类都继承于Object
 - 可以使用 
dynamic指定类型 - 可以通过 
_打头的方式,让变量私有,只能在(library)内部使用 - 错误分为 
warning和error后者会影响程序执行 const和final定义的值,定义后不会改变final定义的常值可以更改指向内部存储的数据(指向不可以更改),const指向,以及指向的值都不可以修改
数据类型
数字 num 是 int double 的基类。
int:64位整数,double 64位浮点数
字符串:String
- 使用 
${name}实现插入变量值,如果是个合法的标识符,可以省去{} - 可以使用 
+拼接字符串 - 使用三重引号定义多行字符串
 - r 前缀来声明原始字符串,不做字符转译
 
布尔、列表(就是数组)
哈希表(Map),存储数据唯一,以键值对方式存储的数据
符文(Rune)
- 由 
UTF-32码点(Code Point)组成的字符串,一个Rune对应一个Unicode字符 - 一般使用4个 16进制字符 
\uXXXX表示,如果表示的字节数超过4 个,需要用{}括起来 
void main(){
  var x = 1;
  var x1 = 0xDEADBEEF; // 十六进制定义
	var y = 1.1;
  var y1 = 1.35e4; // 科学记数法定义 
  double y2 =1; // 明确指定 变量类型
  var z = int.parse('558');
  assert(z == 558); // assert 只在编译的时候有效果,运行时无效,如果错误,则抛出异常
  String str1 = 3.1125.toStringAsFixed(2);
  assert(str1 == '3.11');
  assert((3<<1) == 6); // 3 << 1 表示放大一倍,
  assert((3>>1) == 1); // 3 >> 1 表示缩小一倍,并且保留整数部分
  assert((3<<2) == 12); // 放大一倍,然后再放大一倍
  assert((3 | 4) == 7);
  // 3 的二进制表示为 0011
  // 4 的二进制表示为 0100
  // 0111
  var str1 = 'It\'s my football.'; // 单引号引起字符串,如果内部使用单引号,需要进行转译 \'
  var str2 = ''' 
  create
  换行也会保留'''; //单引号或者双引号都可以
  var str3 = r"此时\'55"; // 此时不会进行转译
  var emptyStr = '';
  assert(emptyStr.isEmpty); // isEmpty 用来判断是否为空
  var vafaf = 0/0;
  assert(vafaf.isNaN);
  assert(vafaf.runtimeType); // runtimeType 可以得到该数据的类型
  // 定义一个 Map
  var gifts={
    'first':'sss',
    'second':'ddd'
  };
  var gift1 = Map(); // 自定义键值对的插入
  gift1['bo'] = 'cs';
  gift1['bokk'] = 'sscs';// 可以通过 gift1.length 获取键值对的数量 
}
符文
void main(){
  var clapping = '\u{1f44f}'; // 超过两个字节,需要用大括号括起来
  print(clapping);
  print(clapping.codeUnits); // 码元序列
  print(clapping.runes.toList()); // runes 中的字符和 \u 中的字符一一对应
  Runes input = Runes('\u2665 \u{1f605}'); // Runes 中保存的是一个编码的序列
  print(String.fromCharCodes(input));
  void foo(){}// 此时定义的函数,不会有任何返回的值
}
函数
每个程序都有一个顶层的 main 函数,作为程序的入口
函数的闭包,访问外层作用域函数的变量
var funA = ((fcc)=>{
  fcc.Name = 'gogogo'
  var a = 'x';
})(funA||{})
操作符
void main(){
  var a = 1;
  var b = 2;
  var c = true;
  print(a++);
  print(a+b);
  print(a = b);
  print(a == b);
  assert(5 ~/ 2 == 2);// 表示为 5 的整除商
  var x = 1;
  var vis = x ? 'gogo':'nono';
  var someFun = Stringbb();
  someFun.write('aa');
  someFun.write('cc');
  someFun..write('aa')..write('cc') // 等于上面的调用两次方法
}
// >> 为移位符, 比如 1001 ,通过该移位符移位之后是 100
流程控制语句
和大多数语言差不多,if else
while for switch
异常
异常表示有预料之外的错误发生,如果没有进行捕捉错误,那么程序将会终止运行。
Dart 内置两种异常
- 核心库异常 Exception
 - 代码异常 Error
 
throw可以抛出非 null 对象作为异常
try-catch 语句来捕捉异常,防止异常扩散,同时可以使用 on 语句来处理特定类型的异常
rethrow 重新抛出异常
finally 用来执行无论是否有异常都要执行的代码
void main(){
  void foo()=>throw UnimplementedError();// 跑出一个异常
  try{
    foo();
  }on UniplementedError catch (e){ // 用于捕获特定的异常
    print('Unknown exceptinon:$e');
  }catch(e,s){
    print('Exception details:\n $e');// 异常信息
    print('Stack trace:\n $s');// 哪一行代码出现的问题
  }
  // 再次抛出异常
  void misbehave(){
    try {
      dynamic foo = true;
      print(foo++);// 因为boolean 值不能加减,所以抛出异常
    } catch(e){
      print('misbehave() partially handled ${e.runtimeType}.');
      rethrow; // 再次抛出异常
    }
  }
  try {
    misbehave();
  } catch(e){
    print('main() finished handling ${e.runtimeType}.')
  }
}