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那麼規範,可是他依然對開發者有用。