Dart4Flutter - 01 – 变量、类型和函数数据库
Dart4Flutter - 拾遗01 - flutter-dart环境搭建post
Flutter入门 - 状态管理this
Flutter 入门-本地访问-MethodChannelcode
Flutter 实例 - 从本地到Flutter通讯 - Event Channels
关于不变形一直是热定话题,尤为是在前段。像Immutable.js这样的库和单向数据流等其余概念都认为,当数据不可变时,更容易管理数据。
在面向对象和函数是编程中,一个不可变的对象是指,一旦对象建立以后状态是不能修改的。想对应的是可变对象,建立以后,对象状态是能够修改的。
好了,那Dart是怎样作的呢?咱们有几个概念很适合内置的不变性和不可变对象,从const修饰符和const构造函数开始。 不要与ES6中的const混淆,后者只是一个不可变的绑定。
// 定义USER为常量,初始化。
const USER = { name: 'Joe'; }
// 这样将抛出异常.
USER = {};
// 可是这样不会;觉得是绑定的不可变,能够修改对象
USER.name = 'Jill';
复制代码
在Dart中,const是一个不可变绑定,也是不可变对象。
main() {
const user = const {'name': 'Joe'};
// 抛出 Static error: "Constant variables cannot be assigned a value".
user = {};
// 抛出 Runtime error: "Unsupported operation: Cannot modify unmodifiable Map".
user['name'] = 'Jill';
}
复制代码
全部类型,例如(Null, String, int, double, num, bool, Map, List, Symbol),均可以是不可变的,并且能够给自定类型添加const构造函数。
class User {
final String name;
const User(this.name);
}
main() {
const user = const User('Joe');
}
复制代码
让咱们回顾一下 - const实例既是不可变的绑定,又在语言层面强制执行,既是根本不可变的 - 也是在编译时就肯定的 - 也就是说,任何两个实例都被认为是等价的,而且在运行时只能由单个实例表示。 例如,如下内容至关简单,它只在运行时分配一个实例:
class User {
final String name;
final List<String> cars;
User(this.name, {this.cars});
}
main() {
// 虽然循环100次,可是只有一个对象
for (var i = 0; i < 100; i++) {
const users = const {
'Matan': const User(
'Matan Lurey',
cars: const [
'Truck',
'Jeep',
'GoKart',
],
),
};
}
}
复制代码
更多关于const和final请参考Dart官方文档
固然,const是有限制的 - 必须在编译时建立类对象。因此不能完成以下,在运行时,从数据库读出数据,建立对象。咱们如今介绍package:meta的immutable
注解。
import 'pacakge:meta/meta.dart';
// 由于当前类使用@immutable注解,因此变量必须是final的
@immutable
class User {
final String name;
User(this.name)
}
复制代码
你可使用这个注解帮助开发者,强制类是不可变的。可是不像const那么规范,可是他依然对开发者有用。