一小时入门Dart Flutter

本文为Dart初学者提供了快速入门教程,讲解了Dart语言的基本概念,如对象、类、类型推断、泛型、函数和异步编程。内容包括变量、类型、关键字、异常处理、枚举、迭代、控制流以及异步操作的使用,特别强调了Dart中的异步编程模型,如async、await和Future。此外,还提到了Dart中的错误处理、库导入和延迟加载库的使用方法。
摘要由CSDN通过智能技术生成

本文适合有代码基础的人,如果没在代码基础请文章底部来源从头开始学习
###示例

// 定义一个函数
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 打印到控制台。
}

// 应用从这里开始执行。
// 程序开始执行函数,该函数是特定的、必须的、顶级函数。
main() {
  //定义变量,通过这种方式定义变量不需要指定变量类型。
  var number = 42;
  printInteger(number); // 调用函数。
}

###重要的概念
在学习 Dart 语言时, 应该基于以下事实和概念:

  • 任何保存在变量中的都是一个 对象 , 并且所有的对象都是对应一个 类 的实例。 无论是数字,函数和 null 都是对象。所有对象继承自 Object 类。

  • 尽管 Dart 是强类型的,但是 Dart 可以推断类型,所以类型注释是可选的。 在上面的代码中, number 被推断为 int 类型。 如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic 。

  • Dart 支持泛型,如 List (整数列表)或 List (任何类型的对象列表)。

  • Dart 支持顶级函数(例如 main() ), 同样函数绑定在类或对象上(分别是 静态函数 和 实例函数 )。 以及支持函数内创建函数 ( 嵌套 或 局部函数 ) 。

  • 类似地, Dart 支持顶级 变量 , 同样变量绑定在类或对象上(静态变量和实例变量)。 实例变量有时称为字段或属性。

  • 与 Java 不同,Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线(_)开头,则它相对于库是私有的。 有关更多信息,参考 库和可见性。

  • 标识符 以字母或下划线(_)开头,后跟任意字母和数字组合。

  • Dart 语法中包含 表达式( expressions )(有运行时值)和 语句( statements )(没有运行时值)。 例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。

  • Dart 工具提示两种类型问题:警告_和_错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 [异常](#exception)。

###Dart关键字

key 作用域 备注
abstract 2 抽象方法/抽象类
dynamic 2
implements 2
show 1
as 2
else
import 2
static 2
assert
enum
in
super
async 1
export 2
interface 2
switch
await 3
extends
is
sync 1
break
external 2
library 2
this
case
factory 2
mixin 2
throw
catch
false
new
true
class
final
null
try
const
finally
on 1
typedef 2
continue
for
operator 2
var
covariant 2
Function 2
part 2
void
default
get 2
rethrow
while
deferred 2
hide 1
return
with
do
if
set 2
yield 3

###避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:

  • 带有 1 上标的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符。

  • 带有 2 上标的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀。

  • 带有 3 上标的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字。
    不能在标记为 async ,async* 或 sync* 的任何函数体中使用 await 或 yield 作为标识符。

######关键字表中的剩余单词都是保留字。 不能将保留字用作标识符。

####abstract

  • 抽象方法
    实例方法, getter, 和 setter 方法可以是抽象的, 只定义接口不进行实现,而是留给其他类去实现。 抽象方法只存在于 抽象类 中。

定义一个抽象函数,使用分号 (😉 来代替函数体:

abstract class Doer {
  // 定义实例变量和方法 ...

  void doSomething(); // 定义一个抽象方法。
}

class EffectiveDoer extends Doer {
  void doSomething() {
    // 提供方法实现,所以这里的方法就不是抽象方法了...
  }
}

调用抽象方法会导致运行时错误。

  • 抽象类
    使用 abstract 修饰符来定义 抽象类 — 抽象类不能实例化。 抽象类通常用来定义接口,以及部分实现。 如果希望抽象类能够被实例化,那么可以通过定义一个 工厂构造函数 来实现。

抽象类通常具有 抽象方法。 下面是一个声明具有抽象方法的抽象类示例:

// 这个类被定义为抽象类,
// 所以不能被实例化。
abstract class AbstractContainer {
  // 定义构造行数,字段,方法...

  void updateChildren(); // 抽象方法。
}

####dynamic
使用 dynamic 注解替换推断失败的情况。
Dart 允许在许多地方省略类型注解,并尝试推断类型。在某些情况下,如果推断失败了,会默认指定为 dynamic 类型。如果 dynamic 类型与期望相同,那么从技术的角度来讲,这是获取类型最简洁 的方式。

但是,这种方式是最不清晰的。任何一个阅读代码的人,当看到一个类型确实的成员时,是没有办法 知道,编写的人是希望它是 dynamic 类型,还是期望它是其他的什么类型,或者阅读的人就简单的 认为是编写的人忘记了指定类型。

当 dynamic 是你期望的类型,就应该指明它,这样能让你的意图更清晰。

dynamic mergeJson(dynamic original, dynamic changes) => ...

在Dart 2之前,本规则恰恰是相反的:不要 为隐性类型的成员指定 dynamic 注解。基于强类型系统 和类型推断,现在的开发者更希望 Dart 的行为类似于推断的静态类型语言。基于这种心理模型,我们发现 代码区域慢慢地失去了静态类型所具有的安全及性能。

####implements
每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口。 如果要创建一个 A 类,A 要支持 B 类的 API ,但是不需要继承 B 的实现, 那么可以通过 A 实现 B 的接口。

一个类可以通过 implements 关键字来实现一个或者多个接口, 并实现每个接口要求的 API。 例如:

// person 类。 隐式接口里面包含了 greet() 方法声明。
class Person {
  // 包含在接口里,但只在当前库中可见。
  final _name;

  // 不包含在接口里,因为这是一个构造函数。
  Person(this._name);

  // 包含在接口里。
  String greet(String who) => 'Hello, $who. I am $_name.';
}

// person 接口的实现。
class Impostor implements Person {
  get _name => '';

  String greet(String who) => 'Hi $who. Do you know who I am?';
}

String greetBob(Person person) => person.greet('Bob');

void main() {
  print(greetBob(Person('Kathy')));
  print(greetBob(Impostor()));
}
下面示例演示一个类如何实现多个接口: Here’s an example of specifying that a class implements multiple interfaces:

class Point implements Comparable, Location {...}

####show hide
导入库的一部分
如果你只使用库的一部分功能,则可以选择需要导入的 内容。例如:

// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

####as

  • 类型判定运算符
    as, is, 和 is! 运算符用于在运行时处理类型检查:

    Operator Meaning
    as Typecast (也被用于指定库前缀)
    is True if the object has the specified type
    is! False if the object has the specified type

    例如, obj is Object 总是 true。 但是只有 obj 实现了 T 的接口时, obj is T 才是 true。

    使用 as 运算符将对象强制转换为特定类型。 通常,可以认为是 is 类型判定后,被判定对象调用函数的一种缩写形式。 请考虑以下代码:

    if (emp is Person) {
      // Type check
      emp.firstName = 'Bob';
    }
    

    使用 as 运算符进行缩写:

    (emp as Pers
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值