在最近两天 dart 更新到了 2.3 的稳定版

增加了一些语法糖,对于开发 flutter 来说会更加的友好

可以查看 medium

当然,本篇不是翻译,只是对于新语法做一个简单的尝试

…语法

这个语法很眼熟,在 js 中有类似的语法,其他语言可能也有

什么意思呢

看下面的代码

main(List<String> arguments) {
  list3Point();
}

void list3Point() {
  var list1 = <int>[1, 2, 3, 4];

  var list2 = <int>[
    0,
    ...list1,
    6,
  ];

  print(list2); // [0, 1, 2, 3, 4, 6]
}

这里可能会提示需要更新 sdk 约束,可能这个特性是 2.2.2 加入的,更新约束后 yaml 文件被修改

environment:
  sdk: '>=2.2.2 <3.0.0'

旧版本的实现需要以下几个步骤

void list3PointOld() {
  var list1 = <int>[1, 2, 3, 4];
  var list2 = <int>[0];
  list2.addAll(list1);
  list2.add(6);
}

个人觉得代码量不是关键,而是更加直观的看到 list 的顺序

在 flutter 则是这样的:

Widget build(BuildContext context) {
  return Column(
    children: [
      Header(),
      ...buildMainElements(),
      Footer(),
    ],
  );
}

if 语法糖

在 flutter 中可能会这样的情况: 如果条件是假,则不显示某个 Widget

从前在实现的时候,会有各种五花八门的实现

比如:


class _HomePageState extends State<HomePage> {
  String text;

  @override
  Widget build(BuildContext context) {
    // return buildColumn();
    return Column(
      children: <Widget>[
        text != null ? Text(text) : Container(),
      ],
    );
  }

  Widget buildColumn(){
    var widgets = <Widget>[];
    if(text != null) {
      widgets.add(Text(text));
    }
    return Column(
      children: widgets,
    );
  }
}

但是今后最佳实现应该是这样的


class _HomePageState extends State<HomePage> {
  String text;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        if (text != null) Text(text) else Text("空的"),
        if (text != null) Text(text),
      ],
    );
  }
}

这里有一点要注意, if 条件后不能包含{}, 也就是说,这种语法糖只支持单行, 同时也支持 else 语法

else if 的问题:

  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        if (text != null) Text(text) else if(text == "") Text("空字符串") else if(text=="1") Text("我是1") else Text("空的"),
      ],
    );
  }

尝试上面的方法时,会被格式化为下面这样

@override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        if (text != null)
          Text(text)
        else
          if (text == "")
            Text("空字符串")
          else
            if (text == "1") Text("我是1") else Text("空的"),
      ],
    );
  }

所以, 这样的情况下 else 会被单独解析,然后把 if 作为下一个 if 语句去解析

虽然结果应该是相同的,但是尽量避免吧

for 语法糖

  Widget forTest() {
    return Column(
      children: <Widget>[
        for (var i = 0; i < 10; i++) todoText(i.toString()),
      ],
    );
  }

for 也是只支持单行,不支持{}包裹

插件

不是语言特性,但是 dart 的 3.0 插件也同步更新了

支持未导的库直接使用,自动导包

简单举例:

以前解析 json 时,需要先导入 dart:convert 包,或输入 json 后,点击提示键使用 import library 'dart:convert' 来导入包, 而且这一步要求你输入全名才能导入,短的好,有的类名/变量名很长, 一次性输入对的难度较大,只要输入错一个字符就不会提示 20190509164523.png

而现在的操作是会提示 json

Kapture 2019-05-09 at 16.48.51.gif

Kapture 2019-05-09 at 16.50.33.gif

从码代码的角度友好了太多


另: 有一个这个截图, 我这里 vscode 没有看出变化, 可能 android studio 中会有变化吧

20190509165205.png

结尾

flutter 使用的是 flutter sdk 中带的 dart sdk 版本,可以使用 flutter doctor -v 查看, 也可以使用 flutter –version 查看

要确保你的 flutter sdk 支持

如果是写插件,建议短时间内不要使用语法糖,以免兼容问题

以上