当前位置: 首页 > news >正文

Dart4Flutter - 不可变性

Dart4Flutter - 01 – 变量、类型和函数

Dart4Flutter – 02 –控制流 和异常

Dart4Flutter – 03 – 类和泛型

Dart4Flutter – 04 – 异步和库

Dart4Flutter - 拾遗01 - flutter-dart环境搭建

Dart4Flutter - 不可变性

Flutter入门 - 状态管理

Flutter 入门实例1

Flutter 入门 - Container 属性详解

Flutter 入门-本地访问-MethodChannel

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那么规范,但是他依然对开发者有用。

参考

  • medium.com/dartlang/an…

相关文章:

  • Android Toolbar的使用 顶部标题栏+后退键
  • 物联网技术周报第 141 期: 使用 Alexa Voice 和 Raspberry Pi 构建图片识别应用
  • MySQL中sync_relay_log选项对I/O thread的影响分析
  • IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库...
  • 13、jmeter抓包之浏览器请求
  • HDU 5969 最大的位或【贪心/按位或/思维】
  • Linux内核中的锁——知识点
  • 浅谈Service Mesh体系中的Envoy
  • 3 .5 数据库引擎优化顾问
  • 在 Windows 中安装 Laravel 5.1.X
  • Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
  • 2017年开发语言排名
  • 玩转X-CTR100 l STM32F4 l HC-SR04超声波测距
  • 前端存储 - localStorage
  • Xamarin Essentials教程剪贴板Clipboard
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Flex布局到底解决了什么问题
  • HTML5新特性总结
  • MD5加密原理解析及OC版原理实现
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 动态规划入门(以爬楼梯为例)
  • 对超线程几个不同角度的解释
  • 机器学习学习笔记一
  • 离散点最小(凸)包围边界查找
  • 浏览器缓存机制分析
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信小程序开发问题汇总
  • 新手搭建网站的主要流程
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #vue3 实现前端下载excel文件模板功能
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)Nginx简介和安装教程
  • (C)一些题4
  • (Ruby)Ubuntu12.04安装Rails环境
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .aanva
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [android] 手机卫士黑名单功能(ListView优化)
  • [ARC066F]Contest with Drinks Hard
  • [BetterExplained]书写是为了更好的思考(转载)
  • [bzoj1912]异象石(set)
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [codevs1288] 埃及分数
  • [LeetCode]Balanced Binary Tree