Dart 空安全 技术预览版2

Why null safety?

空安全是一个非常具有生产力的功能,能够帮助你避免空异常。除此之外它也能有一定程度上的性能提升。

Dart是一个类型安全的语言。这意味着当你定义了某类型的变量时,编译器可以保证该变量是确定的类型。当时却无法保证该类型是非空的。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

// This app simulates possible null errors. Try running it and see if it fails.
// You can then try to hot reload a few times; you should see it occasionally
// failing and occasionally succeeding.
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // Get data from services. Note: in a real application,
    // these would be async calls, but we’re using sync calls
    // for simplicity.
    final localizedAppName = Config.getAppName();
    final temperatures = WeatherService.getTemperatures();

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(localizedAppName)),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Temperature next 3 days:'),
              for (final t in temperatures) Text(t.round().toString()),
            ],
          ),
        ),
      ),
    );
  }
}

class Config {
  static String getAppName() {
    // Imagine this looks up a localized version of the app name. We're using
    // the current time to simulate a variance in responses.
    if (DateTime.now().second.isEven) {
      return 'Weather forecast';
    } else {
      // Oops, we don't have a localization.
      return null;
    }
  }
}

class WeatherService {
  static List<double> getTemperatures() {
    // Imagine this makes a network call to get the current temperature.
    // We're using the current time to simulate a variance in responses.
    if (DateTime.now().millisecond.isEven) {
      return [32.2, 34.5, 31.0];
    } else {
      if ((DateTime.now().second / 10).round().isEven) {
        // Oops, we couldn't get any temperatures.
        return null;
      } else {
        // Oops, we couldn't get one of the temperatures.
        return [32.2, 34.5, null, 31.0];
      }
    }
  }
}

以上代码将会在 for loop 和Text文本出现空异常。

Screenshot of the preceding code with null errors

而对于空安全检查,编译器将会分析代码,对于为空的位置以红色波浪形做出提示。

Null safety principles

1.Non-nullable by default.除非显示指定某个变量可为空,否则都会被编译器视为非空。

// In null-safe Dart, none of these can ever be null.
var widget = Text('Hello');
final status = GetStatus();
String m = '';

对于以上代码,如果在项目中之后的代码将widget设置为null,开发者将会得到静态分析错误和红色波浪线提示,编译器也会拒绝编译。

1.1 Nullable variables
如果你想要设置某个变量可以为空,可以使用?,比如

// These are all nullable variables.
Text? t = Text('Hello');  // Can be null later.
final Status? s = getStatus();  // Maybe the function returns null.
String? n;  // Is null at first. Can be null at any later time, too.

​ 也可以设置函数参数和返回值为空

// In function parameters.
void initialize(int? count) {
  // It's possible that count is null.
}
// In function return values.
static List<double?>? getTemperatures() {
  // Can return null instead of a List, and the list can contain nulls.
}

1.2 Being productive with null safety
空安全并不仅仅是关于安全,也是简单易用,具备生产力的。

void honk(int? loudness) {
  if (loudness == null) {
    // No loudness specified, notify the developer
    // with maximum loudness.
    _playSound('error.wav', volume: 11);
    return;
  }
  // Loudness is non-null, let's just clamp it to acceptable levels.
  _playSound('honk.wav', volume: loudness.clamp(0, 11));
}

2.Incrementally adoptable.开发者可以自主选择迁移时间,并且一部分一部分迁移。在同一个工程内可以同时有空安全代码和非空安全代码。同时为开发者提供了帮助迁移的工具。基于稳定性考虑,在进行项目迁移的时候官方建议根据依赖顺序进行。

3.Fully sound. Dart空安全是非常健全的。这意味着我们完全可以信任类型系统:如果它判定某个对象非空,那就肯定不会为null。只要把工程和依赖迁移到空安全,不仅会减少代码,也会生成更小的二进制文件和更快的执行效率。

The null safety roadmap

1.Flutter experimentation with *technical preview 2*:当前阶段;

2.Early package migration with *beta*: 今年晚些时候;

3.Production use with stable:大概在明年;

参考自Dart sound null safety: technical preview 2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270