Dart基础知识

Dart重要的概念

  • 所有的东西都是对象,无论是变量、数字、函数都是对象。所有的对象都是类的实例。所有的对象都继承自内置的Object类
  • 程序中指定数据类型使得程序合理地分配内存空间,并帮助编译器进行语法检查,但是指定类型不是必须的。Dart是弱数据类型。
  • Dart代码在运行前解析,指定数据类型和编译时的常量,可以提高运行速度。
  • Dart程序有唯一的程序入口:main()。
  • Dart没有public、protected、private的概念。私有特性通过变量或函数加上下划线来表示。
  • Dart支持anync/await异步处理。

变量和基本数据类型

  • 变量的声明,可以使用 var、Object 或 dynamic 关键字,如果没有将变量初始化,那么它的默认值是null。
    创建变量并初始化变量实例:
    var name = '张三' ;
    //如果对象不限于单一类型(没有明确的类型),请使用Object或dynamic关键字
    Object name = '张三';
    dynamic name = '李四';
  • 如果定义的变量不会变化,可以使用 final 或 const。final 的值只能被设置一次;const 是一个编译时常量。final的顶级或类变量在第一次使用时被初始化。
  1. 被final或者const修饰的变量,变量类型可以省略。
//可以省略String这个类型声明
final name1 = "张三";
//final String name1  = "张三"; 
  1. 被 final 或 const 修饰的变量无法再去修改其值。
  final name1 = "张三";
    // 这样写,编译器提示:a final variable, can only be set once
    // 一个final变量,只能被设置一次。
    //name1 = "zhangsan";
  1. 注意:flnal 或者 const 不能和 var 同时使用
  2. 常量如果是类级别的,请使用 static const
基本数据类型

Dart语言常用的基本数据类型包括:Number、String、Boolean、List、Map。

(1)Number类型

Number是数字类型的父类,包含如下两个类。

  • int整形。取值范围:-2^53 ~ 2^53。
  • double浮点型。64位长度的双精度浮点型。
(2)String字符串类型
  • 可以使用相邻字符串文字或+ 运算符连接字符串:
 // 直接把相邻字符串写在一起,就可以连接字符串了。
  String connectionStr1 =  '字符串''连接''字符串。';
  print(connectionStr1);// 字符串连接字符串。
 // 用+把相邻字符串连接起来。
  String connectionStr2 =  '字符串'+ '连接'+ '字符串。';
  print(connectionStr2);// 字符串连接字符串。
  • 使用三个单引号或双引号定义多行字符串,多用来表示大文本块
String multiLineStr = ''' 
  这是用单引号创建的
  多行字符串。
  ''' ;
(3)Boolean类型

Dart是强bool类型检查,只有bool类型的值是true才被认为是true。有的语言里0是false,大于0是true。

//下面的代码编译错误,因为name是个字符串
    var name = '张三' ;
    if(name){
     print("你的姓名是:"+name);
    }
(4)List类型

在Dart语言中,具有一系列相同类型的数据称为List对象。可以直接打印list的元素,list也是一个对象。list里面的元素必须保持类型一致,不一致就会报错。list的角标从0开始。

List list = [1, 3, 5];
print(list);// 输出结果  [1, 3, 5]
(5)Map类型

Dart中的map是将键和值相关联的对象。键和值都可以是任何类型的对象。key必须是唯一的。

  • 创建方式:直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开。
Map week = {'Monday': '星期一', 'Tuseday': '星期二', 'Wednesday': '星期三',
'Thursday': '星期四', 'Friday': '星期五', 'Saturday': '星期六', 'Sunday': '星期日'};
print(week);
  • 使用Map对象的构造函数Map()来创建对象。
  Map week = new Map();
  week['Monday'] = '星期一';
  week['Tuseday'] = '星期二';
  week['Wednesday'] = '星期三';
  week['Thursday'] = '星期四';
  week['Friday'] = '星期五';
  week['Saturday'] = '星期六';
  week['Sunday'] = '星期日';
  print(week);
  • 要创建一个编译时常量const的map,请在map文字之前添加const:
final fruitConstantMap = const {2: 'apple',10: 'orange',18: 'banana'};
// 打印结果{second: 腾讯, fifth: 百度, 5: 华为}

函数

1.可选参数

将参数使用中括号[]括起来,用来表明是可选位置参数。

2.参数默认值

如果参数指定了默认值,当不传入值时,函授里会使用这个默认值。通常参数的默认值是null。

3.函授返回值特点
  • 所有的函数都会有返回值
  • 如果没有指定函数返回值,则默认的返回值是null
  • 没有返回值的函数,系统会在最后添加隐式的return语句

运算符

1.算术运算符

/ 除法,结果为浮点型
~/ 除法,返回一个整数值的除法。
% 取余,除法剩下的余数。

  var result = 7/2;
  print(result); // 结果是:3.5
  var result1 = 15~/7;
  print(result1); // 结果是:2
  var result2 = 15%7;
  print(result2); // 结果是:1

Dart还支持前缀和后缀递增和递减运算符

操作符 含义
++var var = var+1 表达式的值为var+1
var++ var = var+1 表达式的值为var
--var var = var-1 表达式的值为var-1
var-- var = var-1 表达式的值为var
var a , b;
a = 0;
b = ++a; //在b获得其值之前自增a
assert(a == b); // 1==1

a = 0;
b = a++; //在b获得其值之后自增a
assert(a != b); // 1!=0

a = 0;
b = --a; //在b获得其值之前自减a
assert(a == b); // -1==-1

a = 0;
b = a--; //在b获得其值之后自减a
assert(a != b); // -1!=0
2.类型操作符

as、is与is!操作符在运行时用于检测类型。

操作符 含义
as 类型转换
is 当对象是相应的类型时返回true
is! 当对象不是相应的类型时返回true
if(user is User){
   user.name = "zhangsan";
}
//如果确认user是User的实例,可以通过as直接简化上面的代码
(user as User).name = "zhangsan";
3.赋值操作符

可以使用= 运算符赋值。要仅在变量为null时赋值,使用??==运算符。

//如果b为空,则将值赋给b,否则,b保持不变
b ??==value;
3.级联符号..

级联符号用两个点(..)表示,可以对同一个对象上进行一系列操作。 除了函数调用之外,还可以访问同一对象上的字段。其实相当于java的链式调用。

String s = (new StringBuffer()
        ..write('test1 ')
        ..write('test2 ')
        ..write('test3 ')
        ..write('test4 ')
        ..write('test5'))
      .toString();
print(s); // test1 test2 test3 test4 test5

异常处理

Dart代码可以抛出并捕获异常。与Java相比,Dart的所有异常都是未经检查的异常。方法不声明它们可能引发哪些异常,也不需要捕获任何异常。
Dart提供了Exception和Error 类型,以及许多预定义的子类型。当然,您可以定义自己的Exception。但是,Dart程序可以抛出任何非空对象。
1. throw抛出异常

throw FormatException('抛出一个FormatException异常');
//你也可以抛出任意对象
throw '格式不正确!';

2. 捕获异常try catch
要处理可能抛出多种类型异常的代码,可以指定多个catch子句。与抛出对象的类型匹配的第一个catch子句处理异常。如果catch子句未指定类型,则该子句可以处理任何类型的抛出对象。可以使用on或catch或两者兼而有之。使用on时需要指定异常类型。使用catch时,你的异常处理程序需要异常对象。

try {
     //...
} on OutOfLlamasException {
  // A specific exception
    // ...
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

可以指定一个或两个参数来捕获异常。第一个是抛出的异常,第二个是堆栈跟踪(StackTrace对象)。

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}

要部分处理异常,同时允许它传递,请使用rethrow关键字。

  try {
    dynamic foo = true;
    print(foo++); // 运行时异常
  } catch (e) {
    rethrow; // 允许调用者查看exception.
  }

3.finally
无论是否抛出异常,要确保某些代码运行,请使用finally子句。如果没有catch子句匹配该异常,则在finally子句运行后传递异常。

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
} finally {
  print('Do some thing:\n');
}

库的使用

1.引用库
通过import语句在一个库中引用另一个库的文件,注意以下事项:

  • 在import语句后面需要接上库文件的路径
  • 对Dart语句提供的库文件使用dart:xxx格式
  • 第三方的库文件使用package:xxx格式

2.指定一个库的前缀
当引用的库拥有相互冲突的名字,可以为其中一个或几个指定不一样的前缀。

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

Element element = new Element();//使用lib1中的Element
lib2.Element element2 = new lib2.Element();//使用lib2中的Element

3.引用库的一部分
如果只需要使用库的一部分内容,可以有选择的引用,使用如下关键字

  • show : 只引用一点
  • hide : 除此之外都引用
//导入foo
import 'package:lib1/lib1.dart' show foo;
//处理foo导入其他所有内容
import 'package:lib2/lib2.dart' hide foo;

你可能感兴趣的:(Dart基础知识)