基本概念
开发环境
- 在线开发环境 DartPad
SDK 2.2.0 稳定版 (Flutter 自带Dart SDK)
基本结构
-
变量声明方法
var name = "Harlie"
String name = “Harlie” // 指定类型方式创建
final name = "Harlie"
final String name = 'Harlie';
const name = "Harlie"
name = "Harlie" // 等同于上述
区别
- var 声明变量并且不指定类型,可以修改
- final 和 const 声明的变量不能再次修改
- final 声明变量可以之后赋值(只能赋值一次),const声明的时候就必须赋值
- 声明 const 的初始化表达式中 const 可以被省略
默认值 null
没有初始化的变量默认值都为mull,因为Dart中一切皆为对象差值运算符 $
const a = 1.1
print('$a'); // 1.1
内建类型
Number、String、Boolean、List(也称为Array)、Map、Set、Rune 、SymbolNumber
num 是 number类型的简写 来作为关键字,int和double是num的子类型
int
- 整型
- 数值范围 -2^53~2^53
double
- 双精度浮点型
```dart main() { int a = -1; double b = 12; double c = 1.2; num d = 1; // num e = -1.1; num f = 1.6; print(‘绝对值:’ + e.abs().toString()); // 1.1 print(‘大于或等于表达式的最小整数:’ + f.ceil().toString()); // 2 print(‘直接舍掉小数位:’ + f.floor().toString()); // 1 print(‘四舍五入:’ + f.round().toString()); // 2
int.parse(‘1’) //String -> int 1 double.parse(‘1.1’) //String -> double 1.1 1.toString() //int -> String ‘1’ 1.1.toStringAsFixed(2) //double -> String ‘1.10’ } ``` 常用方法
- 双精度浮点型
计算方法 + - * /
- abs()
- ceil() 大于或等于表达式的最小整数,只要带小数就往前进一位
- floor 舍掉小数位,不管多大
- round() 四舍五入
int 特有的传统按位运算操作
- 移位(<<, >>)
- 按位与(&)
- 按位或(|)
String
- 单引号’’或双引号””来包裹字符,组成字符串
- 多行字符串使用三重字符串
字符串
- 可以连接字符
- 使用r前缀 可以使字符串里的特殊字符串做为普通字符串
main() {
String str1 = "字符串一";
String str2 = "字符串二";
String str3 = str1 + str2; // + 可以连接2个字符
String str4 = '''
多行
字符串 ''';
String Str5 = r'特殊字符串\n换行符'; // 输出为: 特殊字符串\n换行符
}
Boolean
关键字 bool
- 布尔值的类型只有true和false两种
- 与其他语言不同: 例如javaScript中布尔 非空 都是true
- if 判断语句中必须是布尔值
bool flag = true;
bool flag2 = "123"; // 错误写法
if (flag) {}
if ('111'){} 错误写法
List
- Array 数组
- 里面的值可以重复
- 里面的值可以是多种类型
- 对象的有序组
- add() 添加对象
- addAll() 添加list集合到当现有集合
.length 返回集合的长度,返回的值的类型是整型
重点: List的下标从0开始
class Vector {
double x;
double y;
Vector(x, y) {
this.x = x;
this.y = y;
}
toString() {
return 'x:$x;y$y';
}
}
main() {
// 1. Array 数组
List list1 = [1, 1, 2, 3];
List list2 = ['str', 1, true];
// 2. 对象的有序组
List list3 = [
new Vector(1.1, 1.2),
new Vector(2.1, 2.2),
new Vector(3.1, 3.2)
];
list3.add(Vector(4.1, 4.1)); //在dart2.0之后创建对象是可以省去前面的关键字new
List list4 = [Vector(5.1, 5.1), Vector(6.1, 6.1)];
list4.addAll(list3);
list4[0].toString();s
}
Set
- 集合里面的值不可以重复
- 值的类型必须是一致的
set 声明方式
- Set 字面量
- Set 关键字定义
- 指定类型参数
// Set 字面量
var set1 = {'01', '02'};
// Set 类型
Set set2 = {'03', '04'};
// 指定类型
var set3 = <String>{'05'};
Set<String> set4 = {'06'};
set4.add('07');
set4.addAll(set1);
print('set4' + set4.length.toString());
set常用方法
声明方式
Rune符号文字 用来表达Unicode字符
- Unicode为每种语言中的每个字符设定了统一并且唯一的且唯一的二进制编码
Unicode采用UTF-32位编码,Dart中字符串使用utf-16编码,使用特殊语法 \u
var clapping = '\u{00A6}';
print(clapping);
Runes input = new Runes(
'\u{1f44f} \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
Symbol
Symbol 表示 Dart 中声明的操作符或者标识符,该类型的对象几乎不会被使用到
函数
基本概念
Dart是面向对象的语言,函数也是对象类型为Function,可以将函数作为变量或作为其他函数的参数。
Parameters (参数)
必要参数定义在参数列表的前面,可选参数定义在必要参数的后面,可选参数添加@required来标识参数是必须的参数,默认参数 用 ‘=’。
必要参数
可选参数
- 可选的命名参数 {}
- 可选的位置参数 []
import 'package:flutter/material.dart';
// {} 可选的命名参数
bool params01(int name, {int num, String sex = "女", @required int age}) {
return num % 2 == 0 ? true : false;
}
// [] 可选的位置参数
bool params02(String name, [int num, String sex, int age = 25]) {
return num % 2 == 0 ? true : false;
}
main() {
params01(1, num: 4, age: 18);
params02('huihui', 5, '女', 18);
}
main() 函数
每个 Dart 程序都必须有一个 main() 顶级函数作为程序的入口
main() 函数返回值为 void 并且有一个 List
类型的可选参数。 一级对象
可以将函数作为参数传递给另一个函数
void datas(int ele) {
print(ele);
}
main() {
var list = [1, 2, 3, 4];
list.forEach(datas);
}
匿名函数
没有名字的方法,称之为 匿名函数。一般用在Lambda表达式 或 Closure闭包
词法作用域
变量的作用域在写代码的时候就已经确定了,因此,大括号里定义的变量就只能在大括号里访问(跟Javascript相同)
词法闭包
闭包是一个方法(对象)
- 闭包定义在其他方法内部
- 闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
- 总体和Javascript相同
测试函数是否相等
```dart foo() {} // 顶层函数
class A { static void bar() {} // 静态方法 void baz() {} // 实例方法 } main() { var x, y; // 比较顶层函数是否相等。 x = foo; print(x == foo); // true // 比较静态方法是否相等。 x = A.bar; print(A.bar == x); // true // 比较实例方法是否相等。 var v = A(); // A 的实例 #1 var w = A(); // A 的实例 #2 var y = w; x = w.baz; // 这两个闭包引用了相同的实例对象,因此它们相等。 print(y.baz == x); // true // 这两个闭包引用了不同的实例对象,因此它们不相等。 print(v.baz == w.baz); // false } ```