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;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 变量的声明方式 这是创建变量并初始化它的示例:var name = 'Bob' ;name推断变量的类型Strin...
    honestpan阅读 387评论 0 3
  • Flutter日渐火爆,因此在进行Flutter学习前先学习一些其所使用的开发语言dart的基础,这篇文章主要学习...
    Samlss阅读 10,831评论 2 28
  • 八、深入理解java异常处理机制 引子try…catch…finally恐怕是大家再熟悉不过的语句了, 你的答案是...
    壹点零阅读 1,524评论 0 0
  • 此文章是v1.0+时编写,年代久远,小心有毒,谨慎食用!!! 一些重要概念 所有的东西都是对象,所有的对象都是类的...
    soojade阅读 10,036评论 2 27
  • Dart语法基础 Dart语言简介 Dart是Google推出的一门编程语言,最初是希望取代Javascript运...
    张叔叔阅读 10,568评论 1 9