Dart入门系列:
Flutter开发Dart极速入门 (基本类型)
Flutter开发Dart极速入门 (变量)
Flutter开发Dart极速入门 (函数)
Flutter开发Dart极速入门 (操作符与流程控制语句)
Flutter开发Dart极速入门 (异常)
Flutter开发Dart极速入门 (类和对象)
Flutter开发Dart极速入门 (泛型)
Flutter开发Dart极速入门 (Dart异步详解)
Flutter开发Dart极速入门 (生成器)
Flutter开发Dart极速入门 (库的使用)
Flutter插件化开发注意事项(Packages与插件化开发)
Flutter在Android原生工程中的集成
变量
变量的声明
-
var
-
dynamic
-
Object
使用示例
var data1; // 没有定义初始值, 可以变成任意类型 data1 = 'str'; data1 = 1; dynamic data2; data2 = 'str'; data2 = 1; Object data3; data3 = 'str'; data3 = 1;
-
区别
- var 如果没有初始值, 可以变成任意类型
- var 有初始值类型就会被锁定 (声明一个初始化的变量之后, 变量的类型不可再改变)
var variable1 = 'str'; //声明了初始化变量 // variable1 = 1; // 编译不通过, variable1的类型已经被推断为了string
- dynamic 和 Object声明一个初始化的变量之后, 变量的类型仍然可改变
- dynamic:动态任意类型,编译阶段不检查类型, 如调用了该对象的一个不存在的函数, 编译仍可通过, 运行会报错
- Object:动态任意类型,编译阶段检查检查类型
变量的默认值
- 没有初始化的变量自动获取一个默认值: null
- 一切皆对象, 对象的默认值为null (*一切: 包括bool, int等初始值均为null)
final 和 const
-
共同点
-
变量的类型可以忽略
final str = "str";
-
无法修改其值
// str = 'str1'; // a final variable, can only be set once.
-
无法和var同时使用
// final var fvar = 'str'; // 编译不通过: remove var
-
-
区别
-
类级别常量使用static const
// 如系统的 DateTime 类中: // static const int monday = 1; // static const int tuesday = 2;
-
const 常量的值可以使用其他const 常量来初始化
const width = 1; const height = 2; const square = width * height;
-
const 赋值 申明可省略
const List conList = [1,2,3]; // = const [1,2,3]
-
可以更改非final 非 const 变量的值, 即使他曾经拥有const值
var list = const [1,2,3]; list = [1]; // 可以正常编译
-
const导致的不可变性是可传递的
final fList = [1,2,3]; const cList = [1,2,3]; fList[1] = 0; // fList[1,0,3] // cList[1] = 0; // Cannot modify an unmodifiable list print(fList); print(cList);
-
相同的const常量在内存中不会重复创建
const con1 = [1,2,3]; const con2 = [1,2,3]; print(identical(con1, con2)); // identical用于检查两个引用是否指向同一对象: true final fin1 = [1,2,3]; final fin2 = [1,2,3]; print(identical(fin1, fin2)); // false
-
const 的赋值需要是编译时常量
final DateTime dateTime1 = DateTime.now(); // 运行时才能获取其值 // const DateTime dateTime2 = DateTime.now(); // 编译不通过: const variables must be initialized with a constant value. const sum = 1+2; // 正确用法: 编译时常量
-