目录
一、Dart基础知识;
- 新创建Flutter项目,Dart代码主要在 lib/main.dart文件中,由于本篇主要讲的是Dart的语法,故暂时不看main.dart文件,在lib目录下我们创建一个新的.dart文件grammar.dart,如图:
2. 程序入口
每个Dart程序都需要有一个==main()==方法,main()方法是Dart程序执行的入口,因此用Dart写的打印数字程序如下:
void main(){
var number = 22;
printInteget(number);
}
// 1. 打印一个数字
void printInteget(int number){
print('print num $number');
}
说明
- 内置的数据类型:int 、String、List、bool
- 显示输出:print()
- 用’'或者" " 表示一个字符串
- $variableName 或者 ${expression} 表示字符串插值,包含一个变量或者表达式等效于字符串
- var:声明变量而不指定类型
- 当assert(condition) 的condition条件不为真时抛出一个异常
-
强制分号
和JavaScript不同的是,Dart强制使用分号; -
自动类型推断
Dart是强类型语言,但是类型声明是可选的,支持自动推断,所以实例中,可以不写void
二、重要概念:
- 在变量中存放的所有东西都是变量,包括数字,函数和Null,Dart中所有能够使用变量引用的都是对象,每个对象都是一个类的实例,数字、方法、null都是对象,所有对象都继承自Object类
- . Dart支持通用类型,如List(整数列表)活List(任何类型的对象列表)
- Dart支持顶级函数(main()),以及绑定到类或对象(分别是静态方法(static)和实例(instance)方法)的函数,还可以在函数中创建函数
- Dart支持顶级变量。以及绑定到类或对象(静态和实例变量)的变量,实例变量有时也叫字段或属性
- Dart没有访问控制符(即public、protected、private),但是如果一个标识符以_开头,则表示它在 库内 是私有的
- 标识符可以以字母或_开头,后面可以跟其他字符或者数字(注意,Dart不支持$符,也不支持Unicode作为变量名)
- 有时候,某事物是一个表达(expression)还是一个语句(statement)很重要,所以用词要准确
三、Dart中的关键字
说明
(1)带有上标1的单词是内置标识符。避免使用内置标识符作为标识符。如果尝试为类或类型名使用内置标识符,则会发生编译时错误。
(2)使用上标2的单词是在Dart的1.0版本之后添加的与异步支持相关的更新的、有限的保留字。在以async, async*, 或者 sync* 标记的任何函数体中,不能使用async, await, 或者 yield作为标识符。
(3)关键字表中的所有其他词都是保留词。不能使用保留词作为标识符
四、Dart变量
-
声明变量
可以使用如下语法[var|] variableId声明一个变量 -
默认值
声明变量的时候,可以直接进行赋值操作,所赋予的这个值就是默认值。
注意:
未初始化的变量的初始值为null。甚至具有数字类型的变量最初也是null
五、Final 和 const修饰符
如果一个变量声明后不打算修改其值,那么可以把这个变量声明为final或者const,他们的区别在于:
- final只能在初始化时赋值一次,后续值不可以修改
- const同时也是final,区别在于const更加严格,它是编译时常量,也就是说如果一个变量声明为了const,那么应该是在非运行时就能得到这个值
nt getNum() {
return 1;
}
void main() {
final a = getNum(); // 没问题
const b = getNum(); // 报错
}
六、内建类型
Numbers(数值)
Dart的数字有两种形式:
Dart支持两种类型的数值:int和double,它们都是num类的实例。num类型定义了基本的操作符,如+/-/*//,以及abs()、ceil()、floor()等函数,而int子类中还定义了位操作符(如>>)
1. int
- 根据平台的不同,整数值不大于64位
- 如果一个数字包含一个小数,它就是一个双精度数
double y = 1.1;
2. double
64位(双精度)浮点数
strings(字符串)
- 可以使用单引号或双引号创建一个字符串
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
print('$s1,$s2,$s3,$s4');
-
Dart同样支持模板字符串,语法为:
${expression
,如果expression
是一个变量,那么可以省略{},即为$varibale
。如果表达式的结果是一个对象,那么会调用对象的toString()方法 -
可以使用+连接字符串
var s1 = 'Hello';
var s2 = 'World';
print(s1 + s2); // 输出:'HelloWorld'
- 使用带有单引号或双引号的三重引号,创建多行字符串
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
- 用r前缀创建一个“原始”字符串:
var s = r'In a raw string, not even \n gets special treatment.';
// 有\n也不会换号
- 字符串字面量是编译时常量。如果一个字符串带有插值,字符串插值内引用的表达式或者变量计算结果也是编译时常量,那么这个字符串就也是编译时常量,如:
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = const [1, 2, 3];
// 以下字符串是合法的,因为它所引用的也都是编译时常量
const validConstString = '$aConstNum $aConstBool $aConstString';
// 但是下面这个就是非法的,因为所引用的都不是编译时常量(四个变量全报红)
const invalidConstString = '$aNum $aBool $aString $aConstList';
booleans(布尔值)
包括true和false,它们都是编译时常量
在Dart中,我们应该 显式地 判断一个变量,确保其计算结果是布尔型的
var name = 'Ruphi';
if (name) {
print('Hello, $name');
}
lists (列表)
Dart中的数组称为List,其字面量语法示例如下
var list = [1, 2, 3];
如果在list字面量前加一个const关键字,那么可以定义为一个不变的list对象(也就是编译时常量),如
const constantList = const [1, 2, 3];
constantList[1] = 1; // 报错
maps
map是一个关联键和值的对象。键和值都可以是任何类型的对象。每个键只出现一次
var fruits = {
'apple': '苹果',
'banana': '香蕉'
};
var numMap = {
1: '壹',
2: '贰'
};
print('$numMap');
注意:解析器推断gifts的类型为Map<String, String>,nobleGases的类型为Map<int, String>。如果您试图向map添加错误类型的值,则分析器或运行时将引发错误
- 可以使用Map构造函数创建对象:
var fruits = new Map();
fruits['apple'] = '苹果';
fruits['banana'] = '香蕉';
const numMap = new Map();
numMap[1] = '壹';
numMap[2] = '贰';
注意:你可能觉得我们应该使用new Map()而不是使用Map()来创建一个对象。但是,在Dart2中new关键字是可选的
- 在现有的map中添加一个新的键值对
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
- 从map中查询,如果你要获取的键不再map中,将会返回一个null
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
- 使用.length获取map中元素的个数
runes (字符)
表示Unicode码点的常用方法是\uXXXX,其中XXXX是4位数的十六进制值。例如,心型字符(♥)的编码为\ u2665。要指定大于或小于4位十六进制数字,请将值放在花括号中。例如笑脸表情(😆)的编码\u{1f600}.
String类有几个属性可以用来获取runes信息。codeUnitAt和codeUnit属性返回16位代码单元。使用字符属性获取字符串的字符。
main() {
var clapping = '\u{1f600}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
运行效果如下
😀
[55357, 56832]
[128512]
♥ 😅 😎 👻 🖖 👍