变量
弱类型
- var
- 如果没有初始值,可以变成任何类型
var a;
a = 'abc';
a = 123;
a = ['abc'];
- 一旦初始赋值,就确定类型,不能随意改动
var a = 'abc';
a = 123; // A value of type 'int' can't be assigned to a variable of type 'String'.
- Object 动态任意类型,编译阶段检查类型
Object a = 'abc';
a = 123;
a = [222];
a.p(); // The method 'p' isn't defined for the type 'Object'.
- dynamic 动态任意类型, 编译阶段不检查检查类型
dynamic a = 'doucafecat';
a = 123;
a = [1111];
a.p();
总结:var如果有初始值,类型被锁定。Object在编译时检查类型,dynamic不在编译时检查类型。
强类型
- 声明后,类型被锁定
String a;
a = 'abc';
a = 123; // A value of type 'int' can't be assigned to a variable of type 'String'.
- 常见类型 | 名称 | 说明 | | ---- | ---- | | num | 数字 | | int | 整型 | | double| 浮点 | | bool | 布尔 | | String | 字符串 | | StringBuffer | 字符串buffer | | DateTime | 时间日期 | | Duration | 时间区间 | | List | 列表 | | Sets | 无重复队列 | | Maps | kv容器/字典 | | enum | 枚举 |
默认值
var、dynamic变量声明后默认是null, 其他的类型必须得初始化后才能使用。
var a;
print(a); // null
dynamic d;
print(d); // null
Object c;
print(c); // The non-nullable local variable 'c' must be assigned before it can be used.
String b;
print(b); // Non-nullable variable 'b' must be assigned before it can be used.
int e;
print(e); // The non-nullable local variable 'a' must be assigned before it can be used.
使用场景
- var可以简化定义变量 不明确变量类型时
var map = <String, dynamic>{}; // 如果不使用var, 则需要写成 Map<String, dynamic> map = <String, dynamic>{};
- 查询参数定义 例如在api查询通用接口的封装时,一般使用动态类型
Future<Response<T>> get<T>(
String path, {
Map<String, dynamic> queryParams,
...
}
)
- 在实例对象的定义时,一般使用明确类型
class People {
int ID;
int age;
String name;
People({this.ID, this.age, this.name});
...
}
常量
在dart中使用final和const定义常量
- final与const的共同点有
- 类型声明可以省略
final String a = 'abc';
final b = 'abc';
const String c = 'abc';
final d = 'abc';
- 初始值后不能再赋值
final a = 'abc';
a = '123'; // The final variable 'b' can only be set once.
const b = 'abc';
b = '123'; // Constant variables can't be assigned a value.
- 不可与var同时使用
final var a = 'abc'; // Members can't be declared to be both 'final' and 'var'.
const var a = 'abc'; // Members can't be declared to be both 'var' and 'const'.
- final与const的不同点有
- const需要确定的值
final a = DateTime.now();
const b = DateTime.now(); // The constructor being called isn't a const constructor.
- const里面的数据不能修改
final ls = [1, 2, 3];
ls[1] = 4;
const l = [4, 5, 6];
l[1] = 7; // UnsupportedError (Unsupported operation: Cannot modify an unmodifiable list)
- const在内存中不会重复创建
final a1 = [11, 22];
final a2 = [11, 22];
print(identical(a1, a2)); // false
const b1 = [11, 22];
const b2 = [11, 22];
print(identical(b1, b2)); // true
identical 通过比较两个引用的是否是同一个对象判断是否相等
使用场景
- final 成员变量初始值
class EmptyView extends StatelessWideget {
final String? content;
final String? imagePath;
}
- const全局参数
static const FirstOpenApp = 'first_open_app';
static const AppBaseUrl = 'https://....';