1、Flutter 介绍与环境安装
为什么选择 Dart:
- 基于 JIT 快速开发周期:Flutter 在开发阶段采用 JIT 模式,避免每次改动都进行编译,极大的节省了开发时间
- 基于 AOT 发布包:Flutter 在发布时可以通过 AOT 生成高效的 ARM 代码以保证应用性能
- UI 帧率可达 120 FPS:为了快速流畅的用户体验需要能够在每个动画帧运行大量的代码,不能有周期性的停顿,否则会造成掉帧
- 单线程:不需要锁,不存在数据竞争和变量状态同步,也没有线程上下文切换的性能损耗和锁导致的卡顿
- 垃圾回收:多生代(参考了 JVM)无锁垃圾回收器,专门为 UI 框架中常见的大量 Widgets 对象创建和销毁优化
JIT(Just In Time)即时编译,在程序执行期间实时编译为本地机器码;AOT(Ahead Of Time)静态编译,程序运行前编译成本地机器码。在代码的执行效率上,JIT 不如 AOT。
2、Dart 基础语法
Dart 不用编译了,dart xxx.dart 直接就执行,不像 Java 需要先 javac 编译出 class 文件再 java xxx.class 执行。
2.1 变量
类型与声明
变量都是引用类型,未初始化的变量的值是 null。
声明变量的方式通常有三种:
- Object:与 Java 一样 Object 是所有类的基类,Object 声明的变量可以是任意类型。比如数字(包括 int 类型的数字)、方法和 null 都是对象
- var:声明的变量在赋值的那一刻,决定了它是什么类型
- dynamic:不是在编译时候确定实际类型的,而是在运行时。dynamic 声明的变量行为与 Object 一样,使用一样,关键在于运行时原理不同
示例代码:
void test1() {
// 1.通过类型声明变量
Object i = "Test";
// 2.通过 var 声明变量
var j = "Test";
// 报错,声明时已经确定了变量类型,不可更改
// j = 100;
// 3.声明时没有具体指明是什么类型,那么就是默认的 Object 类型
var k;
// 可以为 k 赋值为 Object 的子类型
k = "Test";
k = 100;
// 4.dynamic 动态类型可以赋值不同类型
dynamic z = "Test";
z = 100;
}
需要注意的地方:
- 所有类型,没有初始化的变量自动获取一个默认值为
null
- 声明变量时,可以选择加上具体类型,如
int a = 1;
,但对于局部变量,按照 Dart 代码风格,使用 var 而不是具体类型
final 与 const
final 声明运行时常量,const 声明编译器常量(相比于运行时常量可让代码运行更高效),二者都用于声明常量,可以替代任何类型,只能在声明时初始化,且不能改变:
void test2() {
// 1.const 与 final 可以替代任何类型
const a = 1;
final b = 1;
const int c = 1;
final int d = 1;
// 2.不能通过运行时常量构造编译时常量
final m = 1;
// 企图通过运行时常量构造编译时常量,导致 const 值无法确定
// const n = m + 1;
// 使用编译时能够确定的值构造 const 常量是可以的
const x = 1;
const y = x + 1;
}
类的变量可以是 final 但不能是 const。如果 const 变量在类中,需要定义为 static const 静态常量:
class T {
static const i = 2; // 正确
const j = 1; // 错误
}
2.2 内置类型
Dart 内置以下类型:
- numbers
- strings
- booleans
- lists(也被称之为 arrays)
- maps
- runes(用于在字符串中表示 Unicode 字符)
- symbols
数值 num
num 是数字类型的父类,有两个子类 int 和 double。
int 的默认实现是 64 位,如果编译成 JavaScript,就是 32 位。在编码时,如果 int 长度超过 4 个字节,那么 Dart 会将其编译为类似 Java 的 long 类型,否则编译成 Java 中的 short 或 int。
也就是说,int 的长度是动态确定的,可以通过 int 的 bitLength() 确定存储该 int 变量所需要的最小的位数。
但实际上,不应该将 Dart 的 int 和 Java 的 int 做类比,因为前者是一个类,后者是一个基本类型的关键字。从本质上说,二者不是一个东西,没有可比性。
字符串 String
Dart 字符串是 UTF-16 编码的字符序列,使用方法如下:
-
可以使用单引号或者双引号来创建字符串:
var name = 'lance'; // 如果插入一个简单的标识符,而后面没有紧跟更多的字母数字文本,那么 {} 应该被省略 var a = "my name is $name!"; var b = "my name is ${name.toUpperCase()}!";
-
与 Java 一样可以使用
+
操作符来把拼接字符串,也可以把多个字符串放到一起来实现同样的功能:var a = "my name is " "lance";
-
使用三个单引号或者双引号可以创建多行字符串对象:
var s1 = ''' You can create multi-line strings like this one. '''; var s2 = """This is also a multi-line string.""";
-
可以通过单引号嵌套双引号,或双引号嵌套单引号进行转义:
print("'Test'"); // 'Test' print('"Test"'); // "Test"
-
也可以使用 Java 的方式转义,或者使用 Dart 的 r 前缀创建一个原始字符串实现转义:
// 两行输出结果均为 换行符 \n print("换行符 \\n"); print(r"换行符 \n");
布尔类型 bool
Dart 的布尔类型 bool 有 true 和 false 两个对象。
列表 List
Dart 的数组是 List 对象,它有两种声明方式:
-
当作 List 对象声明:
// new 可以省略 var list = new List(1);
-
当作数组声明:
var list = [1, 2, 3];
通过 for 循环遍历 List 也有两种方式:
for(var item in list) {
print(item);
}
for(var j = 0;j < list.length; ++j) {
print(list[j]);
}
当数组与 const 相结合时,需要注意:
List<int> list1 = const[1,2,3];
// Unsupported operation: Cannot add to an unmodifiable list
//list1.add(4);
const List<int> list2 = [1,2];
// Error: Can't assign to the const variable 'list2'.
//list2 = list1;
// Unsupported operation: Cannot add to an unmodifiable list
//list2.add(4);
const 修是谁,谁就不可变:
- list1 指向不可变的 [1,2,3],那么就不能修改数组,但是可以指向其他数组对象
- list2 本身是一个常量引用,那么它就只能指向 [1,2],不能修改索引,也不能修改索引的内容
映射集合 Map
两种声明方式:
var companys = {'a': '阿里巴巴', 't': '腾讯', 'b': '百度'};
var companys2 = new Map();
// 添加元素
companys2['a'] = '阿里巴巴';
companys2['t'] = '腾讯';
companys2['b'] = '百度';
// 获取与修改元素
var c = companys['c']; // 没有对应的 key 返回null
companys['a'] = 'alibaba';
const 与 Map 结合的情况与 List 样。
Runes
Runes 主要用于获取特殊字符的 Unicode 编码,或者需要将 32 位的 Unicode 编码转换为字符串。
Dart 表达 Unicode 代码点的常用方法是 \uXXXX,其中 XXXX 是 4 位十六进制值。要指定多于或少于 4 个十六进制数字,需要将值放在大括号中:
var clapping = '\u{1f44f}'; // 5 个 16 进制 需要使用 {}
print(clapping); //
标签:总结,name,int,基础知识,print,var,Dart,Flutter,构造函数
From: https://blog.csdn.net/tmacfrank/article/details/144705172