dart官方文档中的 【Effective Dart】 规范主要分为四个部分: 样式规范 文档规范 使用规范 设计规范 每个部分都有许多的例子说明,每个例子都会以下面五个词中的某些作为开头: DO :...表示你需要遵守的做法 DONT :表示这样的做法是非常不好的 PREFER :在多数情况下,都推荐的做法 AVOID : 在多数情况下,都应该避免的做法 CONSIDER : 需要你自己去斟酌的做法...final NUMBER_GENERATOR = Random(); } 花括号 DO: 只有一个if语句且没有else的时候,并且在一行内能够很好的展示,就可以不用花括号 ✅ if (arg ==...= other.overflowChars) return overflowChars < other.overflowChars; 文档规范 DO: 在dart的注释中,更加推荐使用///而非//...在Dart中,如果要迭代序列,那么惯用的方法就是使用循环。
在Dart中没有具体实现的方法(没有方法体),就是抽象方法。 抽象方法,必须存在于抽象类中。 抽象类是使用abstract声明的类。...注意二:抽象类中的抽象方法必须被子类实现, 抽象类中的已经被实现方法, 可以不被子类重写. 2.6 隐式接口 Dart中的接口比较特殊, 没有一个专门的关键字来声明接口。...通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。 4.1 为什么使用泛型?...那么,当一个非字符串被赋值给了这个 list 时,开发工具就能够检测到这样的做法可能存在错误。...类型会导致错误: var foo = Foo(); 4.4 使用泛型函数 最初,Dart 的泛型只能用于类。
收到消息和回复,并且必须在平台的主UI线程上发送。 在Dart中,每个Dart isolate只有一个线程,即每个Flutter视图,因此不必对使用了哪个线程而感到困惑。 异常。...使用BinaryCodec的message channels 在Dart中的类型是BasicMessageChannel 。...使用JSONMessageCodec的message channels 在Dart中的类型是BasicMessageChannel 。...任何消息编解码器都必须支持并保留空消息,因为如果在一个channel在接收方上没有注册handler的话,空消息将被用作默认回复消息。 在Dart中使用静态类型。...在Dart方面,它们的运行时类型分别为List 和Map ,而Dart 2会防止这样的值被赋给具有更多特定类型的参数。
定义变量 Dart中定义变量和java,javascript中定义变量是一致的,如下所示: var name = 'jack'; 复制代码 上面我们使用var表示name的类型是可以通过推断得到。...在程序编写过程中,如果我们遇到某些变量并不知道其类型的时候,可以尝试使用var,让dart自行推断。...和java中不一样的是,dart中所有的number的初始值也是null。这是因为dart中的number也是一个对象。 如果一个变量可以为null,那么在赋值的时候可以在变量类型后面加上?...因为有时候Dart无法检查某些变量在使用之前是否被初始化了,但是如果你非常确定的话,使用late来修饰它即可。...[]` 复制代码 上面的代码中,虽然age的值是const的,但是age本身并不是const,所以age是可以重新被赋值的: foo = [18, 21, 23]; 复制代码 但是bar是final
在程序编写过程中,如果我们遇到某些变量并不知道其类型的时候,可以尝试使用var,让dart自行推断。...当然,我们也可以指定变量的类型,如上所示,可以指定name为String类型: String name = 'jack'; 在dart中,所有的变量都是Object,而每个对象都是一个Class的实例...和java中不一样的是,dart中所有的number的初始值也是null。这是因为dart中的number也是一个对象。 如果一个变量可以为null,那么在赋值的时候可以在变量类型后面加上?...因为有时候Dart无法检查某些变量在使用之前是否被初始化了,但是如果你非常确定的话,使用late来修饰它即可。...[]` 上面的代码中,虽然age的值是const的,但是age本身并不是const,所以age是可以重新被赋值的: foo = [18, 21, 23]; 但是bar是final的,所以bar并不能被重新赋值
在连续行上使用 /// 与多行文档注释具有相同的效果。在文档注释中,除非用中括号括起来,否则Dart 编译器会忽略所有文本。 使用中括号可以引用类、 方法、 字段、 顶级变量、 函数、 和参数。...2.3 常量 Final 和 Const 使用过程中从来不会被修改的值,我们成为常量,可以使用 final 或 const, 而不是 var 或者其他类型。...Final 变量的值只能被设置一次; Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型.) 。最高级 final 变量或类变量在第一次使用时被初始化。...var foo = const []; final bar = const []; const baz = []; // 声明 const 的初始化表达式中 const 可以被省略。...//非 Final , 非 const 的变量是可以被修改的,即使这些变量 曾经引用过 const 值。 foo = [1, 2, 3]; // 曾经引用过 const [] 常量值。
库和可见性 使用import关键字导入 dart内置库,使用dart:xxxx 其他库,package:xxxx 以下划线(_)开头的成员仅在代码库中可见 每个 Dart 程序都是一个库,即便没有使用关键字...lib2.Element element2 = lib2.Element(); 导入库的一部分 只想使用代码库中的一部分,你可以有选择地导入代码库 // 只导入 lib1 中的 foo。...(Import only foo). import 'package:lib1/lib1.dart' show foo; // 导入 lib2 中除了 foo 外的所有。...import 'package:lib2/lib2.dart' hide foo; 注释 单行注释 单行注释以 // 开始。所有在 // 和该行结尾之间的内容被编译器忽略。...mixin为类添加功能 Mixin 是一种在多重继承中复用某个类中代码的方法模式 使用with关键字 使用mixin定义 使用on规定哪个类可以使用 覆写操作符基本格式: 返回类型 operator 操作符
在程序编写过程中,如果我们遇到某些变量并不知道其类型的时候,可以尝试使用var,让dart自行推断。...当然,我们也可以指定变量的类型,如上所示,可以指定name为String类型: String name = 'jack'; 在dart中,所有的变量都是Object,而每个对象都是一个Class的实例。...和java中不一样的是,dart中所有的number的初始值也是null。这是因为dart中的number也是一个对象。 如果一个变量可以为null,那么在赋值的时候可以在变量类型后面加上?...因为有时候Dart无法检查某些变量在使用之前是否被初始化了,但是如果你非常确定的话,使用late来修饰它即可。...[]` 上面的代码中,虽然age的值是const的,但是age本身并不是const,所以age是可以重新被赋值的: foo = [18, 21, 23]; 但是bar是final的,所以bar并不能被重新赋值
尽管 Dart 是强类型语言,但是在声明变量时指定类型是可选的,因为 Dart 可以进行类型推断。在上述代码中,变量 number 的类型被推断为 int 类型。...顶层的 final 变量或者类的 final 变量在其第一次使用的时候被初始化。...详情请查阅 不要冗余地使用 const。 没有使用 final 或 const 修饰的变量的值是可以被更改的,即使这些变量之前引用过 const 的值。...==(y) 将会返回值,这里不管有没有 y,即 y 是可选的。也就是说 == 其实是 x 中的一个方法,并且可以被重写。详情请查阅重写运算符。...版本提示: mixin 关键字在 Dart 2.1 中才被引用支持。早期版本中的代码通常使用 abstract class 代替。
⑤ const/final 与静态数据 在 dart 中 const/final 使用的地方非常多,可以用于修饰变量、实例变量、对象创建。...相对 final 有所优化 修饰对象创建 var foo = const []; const 修饰变量创建,Dart 会默认以 const 的上下文来实例化对象: const primaryColors...即静态类型+运行时检查, 比如一个变量静态类型为 String,如果将 int 赋值给它,编译器会报错。但是通过某些手段,我们可以绕过编译器检查,例如强制类型转换。...类似于 Ruby 的 method_missing。当未找到属性或者方法时被调用,可以实现一些动态属性或方法。元编程神器。在 JavaScript 中可以通过 Proxy 实现相同的效果。...说实话,Dart 没有什么多少让人眼前一亮的特性。在它身上你可以看到许多其他语言的影子、例如 Java、JavaScript、Swift... 这也无可厚非,现代编程语言确实长得越来越像。
指定静态类型(例如上例中的num) (您可能也有兴趣有一个特殊的类型:dynamic。)在Dart 1.x中指定静态类型是可选的,但Dart正在转向成为完全类型的安全语言。...在强类型模式下,静态和运行时检查确保您的代码是安全的,帮助您捕获开发中的错误,而不是在运行时。强力模式在Dart 1.x 中是可选的,但在Dart 2.0中不是可选的。...(等位运算符,如 >>, 在 int 类中定义.) 如果num和它的子类型没有你寻找的, dart:math 库可能会有....可选参数(Optional parameters) 可选参数分为 命名参数 和 位置参数 ,一个函数中只能使用其中一中,即不能同时存在于一个函数中。...与Java不同, Dart中的所有异常都属于未检查异常.方法也不声明抛出什么异常,你也没有必要捕获异常. Dart提供 Exception 和 Error 类型,以及许多预定义的子类型.
Flutter教程在这里 Final 和 const 如果您从不打算更改变量,请使用final或const,而不是var或类型。 final变量只能被初始化一次; const变量是编译时常量。...下面是一个创建并设置final变量的例子: final name = 'Bob'; // 没有声明类型 final String nickname = 'Bobby' 您不可以修改一个final变量的值...: name = 'Alice'; // 错误: final变量只能被始化一次。 如果您让变量变成编译时常量,请使用const。...内置类型 Dart特别支持以下类型: 数字类型 字符串 布尔值 表(lists,也被称作数组) 映射(maps) 符文(用于表示字符串中的Unicode字符) 符号 您可以使用文字初始化任何这些特殊类型的对象...因为Dart中的每个变量都引用一个对象 - 一个类的实例 - 您通常可以使用构造函数来初始化变量。 一些内置类型有自己的构造函数。 例如,您可以使用Map()构造函数来创建Map。
Linter rule: constant_identifier_names[5] 在新的代码中,使用 lowerCamelCase 来命名常量,包括枚举的值。...•在枚举类型中自动定义的 values 属性为常量并且是小写字母 形式的 要把超过两个字母的首字母大写缩略词和缩写词当做一般单词来对待 首字母大写缩略词比较难阅读, 特别是多个缩略词连载一起的时候会引起歧义...Dart 可以提示你声明的类型,范围,可变性和其他属性, 所以没有理由在标识符名称中对这些属性进行编码。...具有一致的空格风格有助于帮助我们能够用编译器相同的方式理解代码 要使用 dartfmt 格式化你的代码 格式化是一项繁琐的工作,尤其在重构过程中特别耗时。庆幸的是,你不必担心。...; } 这里有一个例外:一个没有 else 的 if 语句, 并且这个 if 语句以及它的执行体适合在一行中实现。
超类的构造函数在构造函数体的起始处被调用。 如果一个 初始化器列表 也被使用,它将在超类被调用之前执行。...初始化器列表在设置final字段时很方便。 以下示例在初始化程序列表中初始化三个final字段。...按照惯例,类型变量具有单字母名称,例如: E, T, S, K, 和 V. 为什么要用泛型? 因为Dart中的类型是可选的,所以您不必使用泛型 ....使用库 使用 import 来指定一个库的命名空间在另外一个库的作用域内被使用....使用延期加载时,请记住以下几点: 延迟库的常量不是导入文件中的常量。 记住,这些常量在加载延迟库之前不存在. 您不能在导入文件中使用延迟库中的类型。
,应该基于以下事实和概念 任何保存在变量中的都是一个对象;所有的对象都对应一个类的实例,函数 和 null 都是对象,所有对象基于 Object 类 虽然 Dart 是强类型的,但是 Dart 可以进行类型推断...,如上面代码变量 number 被推断为 int 类型;如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic Dart 支持泛型,如 List , List(任何类型的对象列表...Dart 中一切皆是对象 Final 和 Const 使用过程中从来都不会被修改的变量,可用 final 或者 const。final 变量的值只能被设置一次,const 变量在编译时就已经固定。...词法闭包 闭包即一个函数对象。即使函数的调用在他原始的作用域之外,依然能访问他在词法作用域内的变量 /// 返回一个函数,返回的函数参数与 [addBy] 相加。...Dart2中,一个常量上下文中的 const 关键字可以被省略 class ImmutablePoint { static final ImmutablePoint origin = const
,但是 Dart 可以进行类型推断,如上面代码变量 number 被推断为 int 类型;如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic Dart 支持泛型,如 List , List...Dart 中一切皆是对象 Final 和 Const 使用过程中从来都不会被修改的变量,可用 final 或者 const。final 变量的值只能被设置一次,const 变量在编译时就已经固定。...意味着函数可以被赋值给变量,或者作为参数传递给其他函数,也可以把 Dart 类的实例当做方法来调用 //省略类型声明,函数可以正常使用 isNoble(atomicNumber) { return...词法闭包 闭包即一个函数对象。即使函数的调用在他原始的作用域之外,依然能访问他在词法作用域内的变量 /// 返回一个函数,返回的函数参数与 [addBy] 相加。...Dart2中,一个常量上下文中的 const 关键字可以被省略 class ImmutablePoint { static final ImmutablePoint origin = const
一个 final 变量只能被设置一次;const 变量是一个编译时常量。(Const变量是隐式的final。) final的顶级或类变量在第一次使用时被初始化。...1、被final或者const修饰的变量,变量类型可以省略。...num类型包括基本的运算符,如+,-,/和*,位运算符,如>>,在int类中定义。 如果num和它的子类没有你要找的东西,math库可能会找到。...(1) int int表示整数,int的取值不大于64位,具体取决于平台。在Dart VM上,值可以从 -2的63次方 到 2的63次方减1. 整数是没有小数点的数字。...该函数被list中的每个item调用,输出一个字符串,该字符串包含指定索引处的值。
3.2.2 默认值 在Dart中,一切皆为对象,未初始化的变量默认值是null。 3.2.3 声明常量 在Dart中,声明使用过程中不会被修改的变量(即常量)可以使用final或const关键字。...Dart中的List类型和JavaScript中的Array类型是类似的。...枚举类型使用enum关键字进行定义,枚举类型中的每个值都有一个index的getter方法,用来标记元素在枚举类型中的位置。...中,枚举类型不能被子类化、继承或实现,不能被显示实例化。...并发编程中,经常会使用Future来处理异步或延时任务,在Dart中通用也使用Future来处理异步任务。
其中有一个非常值得注意,使用者很容易忽略的一点: Dart3.0 之前: 分支中的 case 关键字后的对象必须是 常量 。 1....Dart 3.0 之前的 switch 关键字 在日常开发中,switch 匹配的对象,一般是 int/double/String/enum。...只不过这种写法并不是很常用,Dart 3.0 之前的 switch 语法点也就止步于此: void foo2(Number value) { // switch 在 Dart 3.0.0 之前就一直可以匹配任何对象...常量与解构变量 在本篇一开始时就介绍了 switch 的分支语句是对 常量 的匹配, 既然可以被 switch 匹配,就可以视为 Patterns 模式, 这就不过多赘述了。...如下所示, foo2 中传入一个 dynamic 类型的值,在 switch 中可以进行匹配:在 case 中解构 value 值,这样就可以根据变量类型匹配,进入不同的分支进行处理: void main
即不变性(Immutability)模式。就是对象一旦被创建之后,状态就不再发生变化。换句话说,变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。...快速实现具备不可变性的类 将一个类所有的属性都设置成final的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。 更严格的做法是这个类本身也是final的,即不允许继承。...Long这个类并没有照搬享元模式,Long内部维护了一个静态的对象池,仅缓存了[-128,127]之间的数字,这个对象池在JVM启动的时候就创建好了,而且这个对象池一直都不会变化,即它是静态的。...Immutability模式的注意事项 对象的所有属性都是final的,并不能保证不可变性 不可变对象也需要正确发布 在Java语言中,final修饰的属性一旦被赋值,就不可以再修改,但是如果属性的类型是普通对象...在多线程领域,无状态对象没有线程安全问题,无需同步处理,自然性能很好;在分布式领域,无状态意味着可以无限地水平扩展,所以分布式领域里面性能的瓶颈一定不是出在无状态的服务节点上。
领取专属 10元无门槛券
手把手带您无忧上云