首页/文章/flutter

04.Dart 基础 - 变量(var、默认值、late、final和const)

2024-10-23
13215 分钟
...

变量

var可以自行推断出类型

main(List<String> args) {
  var name = 'Bob';
  
  var a = 1, b = 2, c = 3;
  var d, e, f;
  print("a=${a} b=${b} d=${d} e=${e} f=${f}"); 

  d = true;e = "123" ;f = 123;
  print("a=$a b=$b d=$d e=$e f=$f"); 
}

变量仅存储对象的引用。这里名为 name 的变量存储了一个 String 类型对象的引用,“Bob” 则是该对象的值。

name 变量的类型被推断为 String,但是你可以为其指定类型。如果一个对象的引用不局限于单一的类型,可以将其指定为 Object(或 dynamic)类型。

dynamic name = 'Bob';

另一种方式是显式声明可以推断出的类型:

String name = 'Bob';

默认值

在 Dart 中,未初始化以及可空类型的变量拥有一个默认的初始值 null。(如果你未迁移至 空安全,所有变量都为可空类型。)即便数字也是如此,因为在 Dart 中一切皆为对象,数字也不例外。

int? lineCount
assert(lineCount == null)

assert() 的调用将会在生产环境的代码中被忽略掉。在开发过程中,assert(condition) 将会在 条件判断 为 false 时抛出一个异常。详情请查阅 Assert

  1. 如果启用空安全,则必须在使用非空变量之前初始化它们的值:
int lineCount = 0;

不必在声明局部变量的地方初始化,但需要在使用它之前给它赋值。如下示例,因为Dart可以检测到lineCount在传递给print()时是非空的

void main(){
    int lineCount;
    lineCount = 0;
    print(lineCount);
}

late 关键字实现延迟初始化

Dart 2.12添加了延迟加载修饰符,它有两个用例:

  • 声明一个不可空的变量,并在声明后初始化。
  • 延迟初始化变量。 通常Dart的控制流分析可以在使用非空变量之前检测到该变量是否被设置为非空值,但有时分析会失败。两种常见的情况是顶级变量和实例变量:Dart通常不能确定是否设置了它们,所以它不会尝试。
    如果你确定一个变量在使用之前就被设置了,但是Dart不同意,你可以通过标记变量为late来解决这个错误:
late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

如果late延迟初始化变量失败,则在使用该变量时发生运行时错误。\

如果将一个变量标记为late,但在声明时初始化它,那么初始化式将在该变量第一次使用时运行。这种延迟初始化在以下几种情况下很方便:

  • 该变量可能不需要,并且初始化它的代价很高。
  • 你正在初始化一个实例变量,它的初始化需要访问这个。 在下面的例子中,如果从未使用过temperature变量,则不会调用_readThermometer()函数:

late String temperature = _readThermometer(); 

Final 和 Const

如果你不想更改一个变量,可以使用关键字 final 或者 const 修饰变量,这两个关键字可以替代 var 关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时常量(const 变量同时也是 final 的)。顶层的 final 变量或者类的 final 变量在其第一次使用的时候被初始化。

虽然final对象不能被修改,但是它的字段可以被修改。相比之下,const对象及其字段是不可更改的:它们是不可变的。

实例变量 可以是 final 的但不可以是 const

下面的示例中我们创建并设置两个 final 变量:

final name = 'Bob'; 
final String nickname = 'Bobby';

你不能修改 final 变量的值:

name = 'Alice'; 

使用关键字 const 修饰变量表示该变量为 编译时常量。如果使用 const 修饰类中的变量,则必须加上 static 关键字,即 static const(译者注:顺序不能颠倒)。在声明 const 变量时可以直接为其赋值,也可以使用其它的 const 变量为其赋值:

const bar = 1000000; 
const double atm = 1.01325 * bar; 

const 关键字不仅仅可以用来定义常量,还可以用来创建 常量值,该常量值可以赋予给任何变量。你也可以将构造函数声明为 const 的,这种类型的构造函数创建的对象是不可改变的。

var foo = const [];
final bar = const [];
const baz = []; 

如果使用初始化表达式为常量赋值可以省略掉关键字 const,比如上面的常量 baz 的赋值就省略掉了 const。详情请查阅 不要冗余地使用 const

没有使用 final 或 const 修饰的变量的值是可以被更改的,即使这些变量之前引用过 const 的值。

foo = [1, 2, 3]; 

常量的值不可以被修改:

baz = [42]; 

你可以在常量中使用 类型检查和强制类型转换 (is 和 as)、 集合中的 if 以及 展开操作符 (... 和 ...?):

const Object i = 3; 
const list = [i as int]; 
const map = {if (i is int) i: 'int'}; 
const set = {if (list is List<int>) ...list}; 

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
flutter2026-07-01
Dart 入门回顾
1\. Dart 是什么 Dart 是一门类型安全、支持面向对象、支持异步编程的语言。它的语法和 JavaScript、TypeScript、Java、C# 都有一些相似之处。 Dart 常见使用场景: Flutter 跨平台应用开发 命令行工具 Web 应用 服务端接口或脚本 作为学习现代类型语言的入口 Dart 的几个核心特点: 静态类型:变量、函数返回值、参数都有类型。 类型推断:很多时候可以用 ,让 Dart 自动推断类型。 空...
学习
flutter2026-07-01
Flutter 常用 Widget 入门
Flutter 的核心思想是:一切皆 Widget。文字、图片、按钮、页面结构、布局、间距、滚动、动画、手势,几乎都由 Widget 组合出来。 1\. Widget 先分成几类理解 | 类别 | 常用 Widget | 解决什么问题 | | | | | | 应用入口 | 、 | 搭建应用外壳、主题、路由 | | 页面骨架 | 、 、 | 标准页面结构 | | 基础显示 | 、 、 | 显示文字、图标、图片 | | 布局容器 | 、 、...
学习
flutter2024-11-21
在 Flutter 中使用 webview_flutter 4.0
1. 2. ,已入选 3. 4. 本文是第 4 篇,定位是新手入门,介绍和演示 webview 的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。 环境准备已经在 说过了,不再赘述。既然是新手入门,就会本着详尽的原则,而且会多配示例。 获取页面信息 获取页面 title 核心方法:controller.getTitle 完整示例,放在 main.dart 就能运行。运行示例,点击获取 title 的按...
学习
flutter2024-11-06
flutter android端运行报错Namespace not specified. Specify a namespace in the module‘s build file
在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始强制要求 namespace 配置,不仅仅是主工程,也包括第三方库都强制要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关配置,这也就导致了我们会出现标题错误: 出现这个问题,我们可能会通过去找到本地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失...
学习
flutter2024-11-03
Flutter中如何实现APP升级功能背景
背景 每个App应用中一定会包含的功能 ,App的运行平台不同实现升级功能的方式也就不同,基本分类如下所示。本文主要聚焦在使用Flutter框架开发的应用在安卓系统内如何更新,以及所涉及要点梳理。 IOS系统 Andriod系统 官网下载 各类应用市场 (本文聚焦点) 功能清单(按步骤) UpgradeCard组件(展示升级内容) 进行新旧版本对比判断是否需要更新 下载更新然后安装应用 UpgradeCard组件 组件需要包含基本标题、...
学习
flutter2024-11-03
Flutter应用内更新App版本使用flutter_downloader而非ota_update
做当前App应用内更新的前提:用户可以在App更新的时候还可以使用软件,不能让他一直等待下载,关闭下载组件后,打开组件还能继续看到他的进度,并且用户锁屏或者短暂退出APP后需要保证任务不能总是挂掉,这里没有用到保活,而是需要用到生命周期去让他暂停和恢复,所以当前app还要有一个全局管理类保存任务id。UI图在最后 (插件文档说明可以通知栏显示,但是我用的这个版本在100%下完后总是failed,而不是complete,就不会很友好,后面...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录