dart 2.3的新东西

文章目录

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

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

可以查看

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

...语法

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

什么意思呢

看下面的代码

 1main(List<String> arguments) {
 2  list3Point();
 3}
 4
 5void list3Point() {
 6  var list1 = <int>[1, 2, 3, 4];
 7
 8  var list2 = <int>[
 9    0,
10    ...list1,
11    6,
12  ];
13
14  print(list2); // [0, 1, 2, 3, 4, 6]
15}

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

1environment:
2  sdk: '>=2.2.2 <3.0.0'

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

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

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

在 flutter 则是这样的:

1Widget build(BuildContext context) {
2  return Column(
3    children: [
4      Header(),
5      ...buildMainElements(),
6      Footer(),
7    ],
8  );
9}

if 语法糖

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

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

比如:

 1
 2class _HomePageState extends State<HomePage> {
 3  String text;
 4
 5  @override
 6  Widget build(BuildContext context) {
 7    // return buildColumn();
 8    return Column(
 9      children: <Widget>[
10        text != null ? Text(text) : Container(),
11      ],
12    );
13  }
14
15  Widget buildColumn(){
16    var widgets = <Widget>[];
17    if(text != null) {
18      widgets.add(Text(text));
19    }
20    return Column(
21      children: widgets,
22    );
23  }
24}

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

 1
 2class _HomePageState extends State<HomePage> {
 3  String text;
 4
 5  @override
 6  Widget build(BuildContext context) {
 7    return Column(
 8      children: <Widget>[
 9        if (text != null) Text(text) else Text("空的"),
10        if (text != null) Text(text),
11      ],
12    );
13  }
14}

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

else if 的问题:

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

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

 1@override
 2  Widget build(BuildContext context) {
 3    return Column(
 4      children: <Widget>[
 5        if (text != null)
 6          Text(text)
 7        else
 8          if (text == "")
 9            Text("空字符串")
10          else
11            if (text == "1") Text("我是1") else Text("空的"),
12      ],
13    );
14  }

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

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

for 语法糖

1  Widget forTest() {
2    return Column(
3      children: <Widget>[
4        for (var i = 0; i < 10; i++) todoText(i.toString()),
5      ],
6    );
7  }

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 支持

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

以上