Dart基础知识

这一篇咱们不讲Flutter 的知识,来说一讲Dart 的基础知识。php

先来看看维基百科上关于Dart 的简介:web

Dart(是一种适用于万维网开放源代码编程语言,由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言。编程

相似JavaScript,Dart也是一种面向对象语言,可是它采用基于类编程。它只容许单一继承,语法风格接近C语言json

再打开 Dart 官网:dart.dev,映入眼帘的是:浏览器

emmmm….很明显,如今知道 Dart 语言的人大部分都是由于 Flutter,这与它的目标成为下一代结构化Web开发语言好像有点误差。(不过在Flutter 1.5 发布的时候发布了 Flutter for web)编程语言

不过无所谓,不管它最开始的目标是什么,既然咱们如今想要学习 Flutter ,那就要了解 Dart 这门开发语言。ide

话很少说,咱们开始。函数

首先咱们要知道,Dart是一个纯面向对象语言,也就是说,在Dart中,一切皆对象。学习

Dart代码长什么样子

好像咱们看到的 Dart 代码都是从 Flutter 里看见的,一个括号套一个括号,一大堆的括号。测试

那么标准的 Dart 代码是什么样的:

// 定义个方法。
printNumber(num aNumber) {
  print('The number is $aNumber.'); // 在控制台打印内容。
}

// 这是程序执行的入口。
main() {
  var number = 42; // 定义并初始化一个变量。
  printNumber(number); // 调用一个方法。
}
复制代码

好像没什么不一样的,只是有一个 num 好像有点不太同样(由于我是搞Android的,因此上来就看到了这一个问题)。

那咱们就从变量开始讲起。

变量

声明变量

在 Dart 中,咱们声明一个变量有两种方法:

var _str = '';
int _num = 1;
复制代码

全部用下划线开头的 不管是方法 仍是变量 都是私有的。

咱们能够用var 来声明一个变量,也能够指定变量的类型。

那么咱们何时用什么样的方式来声明变量呢?

能够经过Dart代码风格推荐里来查询到:

对于局部变量,使用 var 而不是具体的类型来定义局部变量。

对于私有成员变量,推荐使用指定变量的类型来声明变量。

常量

在 Dart 中,咱们声明常量有两种方法:

const String constString = "";
final String _finalString;
复制代码

一种是用 const,一种是用 final。

两种有什么区别?

const

const 是在编译时期就必须赋值,并且 const 在类中的话,就必须定义为 static const.

final

final 讲道理不能说是定义为常量,而应该叫作不能被修改的变量。

由于被 final 修饰的变量只能在类初始化时赋值一次。在编译时咱们看不到其值。

全部内置的变量类型

Dart 内置支持下面这些类型:

  • numbers
  • strings
  • booleans
  • lists (也被称之为 arrays)
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

简单说两个

numbers

Dart 支持两种数值类型 int double ,这两种类型都是 num 的子类

也就是说只要你定义的是数值类型,就能够用 num 来接收。

strings

String 能够用双引号或者单引号来声明。

在字符串中能够用表达式 ${},也能够用 + 号来拼接字符串。

其余的就不说了,至于后两个很大可能用不到。

方法

Dart 是一个真正的面向对象语言,方法也是对象而且具备一种类型, Function类型。

也就是说,咱们能够把方法赋值成变量,来传入另外一个方法。

一个简单的方法

来定义一个简单的方法:

Widget build(BuildContext context) {
  return Container();
}
复制代码

就拿 Flutter 中的 build来讲,这就是一个最基本的 Dart 方法。

返回类型为 Widget, 形参为 BuildContext。里面只有一行代码 return Container();

那对于一个方法中只有一个表达式的,咱们能够这么写:

Widget build(BuildContext context) => Container();
复制代码

这个 => Container(); 语法是 { return Container; } 形式的缩写。=> 语法也称为 胖箭头 语法。

可选参数

方法能够有两种类型的参数:必需的和可选的。 必需的参数在参数列表前面, 后面是可选参数。

在 Dart 中可选参数也有两种,可选命名参数 和 可选位置参数

可选命名参数
String demo(String name, {int age}){
  String result = '个人名字叫$name';
  if(age != null){
    result += ',我今年$age岁了';
  }
  return result;
}
复制代码

这就是一个可选的命名参数,咱们这样调用:

demo('HaSaKi', age: 18);
复制代码
可选位置参数

咱们把刚才的demo 方法改造一下:

String demo(String name, [int age]){
  String result = '个人名字叫$name';
  if(age != null){
    result += ',我今年$age岁了';
  }
  return result;
}
复制代码

把大括号改成了中括号,这样就成为了可选位置参数的方法。

要这样调用:

demo('HaSaKi', 18);

复制代码

参数默认值

在定义方法的时候,咱们可使用 = 来定义参数的默认值

默认值必须是编译时常量。

举个例子:

String demo(String name, {int age = 18}){
  String result = '个人名字叫$name';
  if(age != null){
    result += ',我今年$age岁了';
  }
  return result;
}

复制代码

这个方法如今就算不传 age 的值,也永远都会输出,我今年18岁了。由于给了age默认值。

Dart 中的类和Java 相似,单继承,而且 Object 是全部类的超类。

定义一个类:

class Person{
  String name;
  int age;
  
  say(){
    assert(name == null);
    print('我叫$name');
  }
}

复制代码

能够说和其余语言同样了。

下面来点不同的。

简化变量赋值

在其余语言中,咱们常常会使用构造函数来给类变量赋值。

因为这种需求特别常见,因此 Dart 提供了一个语法糖:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);

  say() {
    assert(name == null);
    print('我叫$name');
  }
}

复制代码

命名构造函数

在 Dart 中,可使用命名构造函数来更清晰的表达你的意图:

class Person {
  String name;
  int age;

  Person.fromJson(Map json) {
    this.name = json['name'];
    this.age = json['age'];
  }

  say() {
    assert(name == null);
    print('我叫$name');
  }
}


复制代码

工厂构造方法

若是一个构造函数并不老是返回一个新的对象,则使用 factory 来定义这个构造函数。

单例也是咱们常用的, 咱们可使用工厂构造方法来让咱们实现单例:

class Person {
  static final Person _person = Person._internal();

  factory Person() {
    return _person;
  }

  Person._internal();
}


复制代码

能够看到,咱们定义了一个私有命名构造函数,也定义了一个工厂构造函数。

定义一个 final 的 Person 对象,而后用工厂构造函数返回它。

咱们来测试一下:

print(Person() == Person());

flutter: true

复制代码

能够证实这样写是没问题的。

级联调用

咱们平时为类的值赋值或调用方法的时候,是这么写的:

var person = Person();
person.name = '哈哈';
person.age = 18;
person.say();

复制代码

有没有很麻烦?Dart 也为咱们考虑到了:

Person()
  ..name = '哈哈'
  ..age = 18
  ..say();

复制代码

总结

目前就写这么多基础的知识吧,能够看到 Dart 为咱们开发人员考虑了不少,是个现代化语言该有的样子。

而如今咱们在Flutter 当中所看到的 Dart 代码只是冰山一角,后续我也会继续为你们写Dart 系列。

请持续关注。

相关文章
相关标签/搜索