Flutter 入门 - Dart 语法扫盲精选

1,138 阅读4分钟

感慨

Flutter入门篇,想多说一些感慨:“没有必要准备充足再出发”。对未知、“新鲜”的技术领域,小伙伴们不忘初心,但忘记了出发。

自我设限的心理暗示只要你找,就肯定能找到一个,最常见的莫过于,没有准备好。每一个说中文的人,无论多么博学,都一定还存在不认识的汉字、存在不会写的笔画,但这些“不认识”、“不会写”,并不会带给你的人际沟通一点点阻碍。同时,没有准备好的困扰,事后证明,要么顺手攻克它,成为了能力圈的一部分,要么是“庸人自扰”的想象产物。

正式开始:

Java、Kotlin、Dart等语言的语法是大同小异的,但上手 Flutter 前,还是建议 “走马观花” 给自己做一下开发语言语法扫盲,磨刀不误砍柴工,这样写代码时就不会磕磕绊绊了。

=> 操作符

=> expr 语法是 { return expr; }

了解即可,不重要。曾经有个朋友钻牛角尖,说:为什么不是 “->”

不用怀疑,这个朋友,就是我自己。「捂脸大哭......」

可选参数

kotlin 等类script语言,是有这个可选参数的设定的,对于开发效率非常有帮助。在 面向程序员效率编程 上,JavaC语言等有一点不友好。

// 可选参数 定义
enableFlags({bool bold, bool hidden}) { // ... }
// 可选参数 调用
enableFlags(bold: true, hidden: false); 

可选位置参数

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');

默认参数值

/// Sets the [bold] and [hidden] flags to the values you
/// specify, defaulting to false.
void enableFlags({bool bold = false, bool hidden = false}) {
  // ...
}

// bold will be true; hidden will be false.
enableFlags(bold: true);

级联语法 ..

JavaScript中有类似的语法设定,Dart抛却强类型设定,其余部分还是和Script语言蛮像的。

querySelector("#sample_text_id")
    ..text = "Click me!"
    ..onClick.listen(reverseText);

构造方法

面向对象语言,不可不知的部分。

构造函数名字可以为 ClassName 或者 ClassName.identifier

命名构造函数

// Named constructor
  Point.fromJson(Map json) {
    x = json['x'];
    y = json['y'];
  }

常量构造函数

使用常量构造函数 可以创建编译时常量,要使用常量构造函数只需要用 const 替代 new 即可

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

assert(identical(a, b)); // They are the same instance!

为类添加功能: Mixin

Mixin是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系。

通过with后面跟一个或多个混入的名称,来 使用Mixin

class Musician extends Performer with Musical {
  // ···
}

class Maestro extends Person
    with Musical, Aggressive, Demented {
  Maestro(String maestroName) {
    name = maestroName;
    canConduct = true;
  }
}

mixin Musical {
  bool canPlayPiano = false;
  bool canCompose = false;
  bool canConduct = false;

  void entertainMe() {
    if (canPlayPiano) {
      print('Playing piano');
    } else if (canConduct) {
      print('Waving hands');
    } else {
      print('Humming to self');
    }
  }
}

关于 异步 async

异步方法的执行可能需要一定时间,但是 异步方法立刻返回 - 在方法体还没执行之前就返回了

关于 阻塞 await

await expression中,expression的返回值通常是一个Future; 如果返回的值不是Future,则Dart会自动把该值放到Future中返回。

Future对象代表返回一个对象的承诺(promise)。await expression执行的结果为这个返回的对象。

*注意:await expression 会阻塞住,直到需要的对象返回为止

Future

Future对象代表返回一个对象的承诺 promise,这一点和JavaScript很像。

* 注意:Future非常重要,会单开一节。

Stream

Stream代表一些列数据。 例如,HTML按钮点击事件就可以使用stream来表示。 还可以把读取文件内容当做一个 Stream。

Callable classes

如果 Dart 类实现了 call() 函数则 可以当做方法来调用

typedefs

在 Dart 中,函数也是对象,就想字符和数字对象一样。 使用 typedef ,或者 function-type alias 为函数起一个别名, 别名可以用来声明字段及返回值类型。

typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}

* 注意:目前,typedefs 只能使用在函数类型上, 我们希望将来这种情况有所改变。

get/set 方法

实例对象的每一个属性都有一个隐式的 Getter 方法,如果为非 final 属性的话还会有一个 Setter 方法

参考

Flutter之旅:Dart语法扫尾-包访问-泛型--异常-异步-mixin