Dart4Flutter - 不可變性

Dart4Flutter - 01 – 變量、類型和函數數據庫

Dart4Flutter – 02 –控制流 和異常編程

Dart4Flutter – 03 – 類和泛型異步

Dart4Flutter – 04 – 異步和庫函數

Dart4Flutter - 拾遺01 - flutter-dart環境搭建post

Dart4Flutter - 不可變性ui

Flutter入門 - 狀態管理this

Flutter 入門實例1spa

Flutter 入門 - Container 屬性詳解3d

Flutter 入門-本地訪問-MethodChannelcode

Flutter 實例 - 加載更多的ListView

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官方文檔

經過package:meta靜態分析檢查

固然,const是有限制的 - 必須在編譯時建立類對象。因此不能完成以下,在運行時,從數據庫讀出數據,建立對象。咱們如今介紹package:meta的immutable註解。

import 'pacakge:meta/meta.dart';
// 由於當前類使用@immutable註解,因此變量必須是final的
@immutable
class User {
  final String name;
  User(this.name)
}
複製代碼

你可使用這個註解幫助開發者,強制類是不可變的。可是不像const那麼規範,可是他依然對開發者有用。

參考

相關文章
相關標籤/搜索