Flutter学习笔记之-Dart语言快速入门

Flutter学习笔记之-Dart语言快速入门

基于有其他开发语言的基础,快速了解Dart语言中的一些语法和区别于其他语言的特殊点

  • 变量

1、变量不限定为单一类型可以指定为dynamic或者Object类型

Object obj = "name";
dynamic obj = "name"
obj = 4;
// 变量的定义
var param = "张三"

2、无论什么类型的变量未初始化的默认值为null

3、final和const

final只能赋值一次,在首次访问时才被初始化
const是编译时常量,一经声明不能再次赋值

4、所有的变量都是一个对象

5、Dart中不能判断非0即真, 或者非空即真

  • 数据类型

num、String、bool、List、Map、Set

  • 运算符

1、??=

??=
a ??= 5
表示a == null,则a = 5,否则就使用a的值

2、级联运算符 … 运行对用一对象进行多项操作

querySelector('#confirm') // 获取html元素对象
  ..text = 'Confirm' // 访问成员
  ..classes.add('important') // 添加样式
  ..onClick.listen((e) => window.alert('Confirmed!')); // 监听事件
  
等同于如下代码
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
  • 函数

函数也是对象。

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
函数中只有一句表达式,可以使用箭头语法(箭头 => 和分号 ; 之间只能使用一个 表达式)
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

可选参数:
1、命名可选参数:调用函数时指定命名参数

// 定义
int add({int num1, int num2}) {
  return num1 + num2;
}
// 调用
add(num1: 3, num2: 4);
使用@required表示参数时必须传递的性质

2、位置可选参数:使用[]来表示里面的参数时可选的

void test(String name, [String param]) {
  print("name = $name - param = $param");
}

// 可选参数提供默认值
void test(String name, [String param = "param"]) {
  print("name = $name - param = $param");
}
  • 扩展extension

类似于swift中的扩展

extension IntExtension on int {
// 给int扩展获取两倍的get方法
  int get doubleNumber {
    return this * 2;
  }
}
  • 异常

Dart中的所有异常类型是非检查异常,可以抛出任何非null对象。

1、Throw

throw FormatException('Expected at least 1 section');
// 抛出任何对象
throw 'Out of llamas!';

2、Catch 捕获异常

使用 on 来指定异常类型, 使用 catch 来 捕获异常对象
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

Dart 是一种基于类和 mixin 继承机制的面向对象的语言。
基于Mixin继承意味着每个类(除 Object 外) 都只有一个超类, 一个类中的代码可以在其他多个继承类中重复使用。

1、构造函数
a、构造函数不会被继承,默认生成一个无参构造函数。
b、自定义构造函数后,默认的无参构造函数失效
c、构造函数的名字可以是 ClassName 或者 ClassName.identifier

class Point {
  num x;
  num y;
  // 构造函数
  Point(this.x, this.y);
}
var p1 = Point(2, 2);

命名构造函数:为一个类生成多个构造函数

class Point {
  num x;
  num y;
  // 命名构造函数
  Point.otherPoint(Point p) {
    this.x = p.x;
    this.y = p.y;
  }
}

构造函数中的初始化列表:

Point.fromJson(Map json): x = json['x'], y = json['y'] {
    print("fromJson");
}

重定向构造函数

class Point {
  num x;
  num y;
  Point(this.x, this.y);
  Point.otherPoint(Point p) {
    this.x = p.x;
    this.y = p.y;
  }
  Point.fromJson(Map json): x = json['x'], y = json['y']   {
    print("fromJson");
  }
  // 重定向到主构造函数
  Point.alongXAxis(num x) : this(x, 0);
}

常量构造函数:类生成的对象是固定不变的

class ImmutablePoint {
  static final ImmutablePoint origin = const ImmutablePoint(0, 0);
  final num x, y;
  const ImmutablePoint(this.x, this.y);
}

工厂构造函数:构造函数并不总是创建这个类的一个新实例时,使用关键字factory
工厂构造函数无法访问this

class Logger {
  final String name;
  bool mute = false;

  // 从命名的 _ 可以知,
  // _cache 是私有属性。
  static final Map _cache =
      {};
  // 工厂构造函数
  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final logger = Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}

2、获取对象的类型

runtimeType
print(${p1.runtimeType})

3、getter和setter方法

自定义get和set方法

class Point {
  num x;
  int get getX {
    return x;
  }
  set setX(int value) {
    this.x = value;
  }
}

4、抽象类和抽象方法

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

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

5、隐试接口

a、每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口。
b、如果要创建一个 A 类,A 要支持 B 类的 API ,但是不需要继承 B 的实现, 那么可以通过 A 实现 B 的接口。
c、一个类可以通过 implements 关键字来实现一个或者多个接口, 并实现每个接口要求的 API。

你可能感兴趣的:(Flutter,Dart基本语法,Dart快速入门)