Android学Dart学习笔记第一节 变量
本文介绍了Dart语言的基础变量知识,包括: 编辑器选择和main函数写法; 使用var定义变量的类型推断特性; 显式声明变量类型的方法; dynamic类型的灵活性和潜在风险; 空安全机制及默认值规则; late修饰符的延迟初始化用法。 文章通过代码示例展示了Dart与Java/Kotlin的相似与差异之处,为Android开发者快速上手Dart提供了实用参考。
序言
你好! flutter快把Android的岗位抢没了,想继续吃互联网这碗饭的话Flutter已经到了不得不学的地步了,Flutter用的是dart语言,就从dart开始吧。
编辑器
我选择的trae,需要安装dart SDK,从官网直接装配个path,都是小意思。网可能不太好,多点几次、无需科学。
main函数
void main() {
print('Hello, World!');
}
和java很像,public static void main,但很简单。同时支持kotlin的写法,单引号和双引号都可以。
如何定义一个变量 var
void main() {
var str = 'hello world';
print(str);
}
熟悉的感觉,var就是kotlin中的写法,不同的是需要加上java中的封号结尾,混搭风。
这里稍稍扩展一下,定义一下其他的常见类型,比如数字,boolean
void main() {
var str = 'hello world';
var a = 1;
var b = 2.0;
var c = false;
// var f = 2.0f;//注意这个写法不行
print('str: $str, a: $a, b: $b, c: $c');
}
需要注意的是dart中没有float的概念,浮点数统一都是double,主要原因还是内存 充裕了,这里就不扩展了,有兴趣的同学可以i奥杰。重点是var,以及kotlin中就有的类型推断支持。
如何主动声明变量类型
void main() {
var str = 'hello world';
String str2 = 'hello world';
Object obj = 'hello world';
print('str: $str, str2: $str2, obj: $obj');
}
也是很熟悉的写法,下面贴一句Object的注释
The base class for all Dart objects except
null.
除了null,object是所有类的基类。
下面再引用一下官方的描述,虽然可以直接指定类型,但建议使用类型推断
文章遵循 代码风格指南 ,使用的是 var 声明局部变量,而不是使用准确的类型。
dynamic是什么
官方文档中特意提到了dynamic,那么他到底是什么
先看下面的例子
var str = 'hello world';
String str2 = 'hello world';
Object obj = 'hello world';
dynamic dyn = 'hello world';
// str = 1;//编译错误,因为str被定义为String类型
dyn = 2.0;
obj = 3;
dynamic看起来好现象和object差不多,接下来打印一下他们的类型
String str2 = 'hello world';
Object obj = 'hello world';
dynamic dyn = 'hello world';
// str = 1;//编译错误,因为str被定义为String类型
dyn = 2.0;
obj = 3;
print("str的类型: ${str.runtimeType}");
print("str2的类型: ${str2.runtimeType}");
print("obj的类型: ${obj.runtimeType}");
print("dyn的类型: ${dyn.runtimeType}");
输出如下:
str的类型: String
str2的类型: String
obj的类型: int
dyn的类型: double
好像也没什么区别。
官方文档也没找到描述,借助网络。
dynamic 是 Drat 语言中的 动态数据类型 , 通过 dynamic 关键字定义的变量 , 在 编译时不会管定义的数据类型 , 运行时才处理变量的类型 , 根据变量赋值的类型推测当前的 dynamic 数据类型的运行时数据类型 , dynamic 变量只有在运行时才知道数据类型 ;
————————————————
版权声明:本文为CSDN博主「韩曙亮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shulianghan/article/details/113723207
上个例子
Object obj = 'hello world';
dynamic dyn = 'hello world';
var a = 1;
a = 2;
// a = 2.0;//编译错误,因为a被定义为int类型
a = dyn;//没有类型错误,因为dyn不检测类型
// a = obj;//编译错误,因为obj被定义为String类型
虽然可以运行,但是报错了
Unhandled exception:
type 'String' is not a subtype of type 'int'
#0 main (file:///D:/DartStudy1/bin/var.dart:12:3)
var.dart:12
#1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
再来一个例子
Object obj = 'hello world';
dynamic dyn = 'hello world';
if(dyn > a) {//正常编译
print('dyn大于a');
}
if(obj > a) {//编译错误,因为obj被定义为String类型
print('obj大于a');
}
总而言之,他可以逃脱类型检查,它可以当作任何类型来用而不会影响编译,及其灵活,也很容易出问题。个人理解相对于any类型,但是使用时无需类型转换,可以用在任何类型,但类型不匹配会在运行时报错。
空安全及默认值
Dart 语言要求以健全的空安全方式编写代码。
看代码
void main() {
var a;
int b;
print(a);
print(b);//编译错误,因为b没有被赋值
}
当变量类型显式声明时,使用该变量时强制为该变量赋值,var使用实行推断,未赋值时默认为null
当显式声明变量需要声明为null时,需要使用 int?的声明方式
void main() {
var a;
int? b = null;
print(a);
print(b);
}
可以正常编译和输出,下面输出了2次 null
2 null
下面演示下,通过类型推断产生的变量,不可再置为null,但可以通过var声明变量为null,此时为dynamic类型
var a = 1;
int? b = null;
var c = null;//c被定义为dynamic类型,所以可以赋值为null
c = 1;
c = "hello";
// a = null;//编译错误,a被定义为int类型,所以不能赋值为null
print(a);
print(b);
print(c.runtimeType);
延迟初始化late
int a;//编译报错,必须初始化
void main() {
print(a);
}
但使用late修饰后,可以运行
late int a;
但会在运行时报错。
late 修饰符有两种用法:
声明一个非空变量,但不在声明时初始化。
延迟初始化一个变量。
通常 Dart 的语义分析可以检测非空变量在使用之前是否被赋值,但有时会分析失败。常见的两种情况是在分析顶级变量和实例变量时,Dart 通常无法确定它们是否已设值,因此不会尝试分析。
如果你确定变量在使用之前已设置,但 Dart 推断错误的话,可以将变量标记为 late 来解决这个问题
通配符变量
通配符变量(Wildcard variables)需要至少 3.7 的 语言版本。
通配符变量 _ 声明了一个不作为可用变量的局部变量或参数,本质上它是一个占位符。
先看看简单用法:
var _ = 1;
var __ = 2;
通配符变量的值不可访问
for (var _ in list) {}
try {
throw '!';
} catch (_) {
print('oops');
}
在java或者kotlin中,类似这样的循环我们必须给他起个名字,比如item。而在dart中,可以直接使用_代替,省去了一部分脑子。
下面时官方文档的提示:
原本用多个下划线(、_ 等)来避免命名冲突的代码,现在可以启用 lint 规则 unnecessary_underscores 来帮助判断是否可以直接用通配符变量 _ 来替代。
我这一段在学习的过程中,有部分知识实践起来是和文档有冲突的:
1、同一命名空间中可以有多个名为 _ 的声明,而不会引发冲突错误(实际上冲突了)
希望了解的同学可以赐教。
更多推荐



所有评论(0)