10天学会flutter DAY1 玩转 变量 类型 操作符 方法 异常


​ 变量是一个引用,未初始化的变量值是null。


Object name1 = 'tiger';

var name2 = 'tiger';

dynamic name3 = 'tiger';

print('$name1 $name2 $name3');

//变量是一个引用,上面的name1、name2与name3的变量都引用了 一个内容为 “tiger” 的 String 对象。



​ 可以用Object、var与dynamic声明的变量赋任何类型的值,但是背后的原理却是非常不同。

1、Object: 与Java一样Object是所有类的基类,Object声明的变量可以是任意类型。(在 Dart 中 甚至连 数字、方法和 null 都是对象,比如int。)


Object a = 1;

a = "a";



2、var: 声明的变量在赋值的那一刻,决定了它是什么类型。


//a已经确定为num,不能再赋值字符串,编译错误

var a = 1;

a = "a";

//正确

var b;

b = 1;

b = "a";



3、dynamic: 不是在编译时候确定实际类型的, 而是在运行时。dynamic声明的变量行为与Object一样

没有初始化的变量自动获取一个默认值为 null(类型为数字的 变量如何没有初始化其值也是 null)。

在声明变量的时候,也可以选择加上具体 类型:int a = 1;

对于局部变量,按照Dart代码风格推荐,使用 var 而不是具体的类型来定义局部变量。

final与const

​ 如果不打算改变一个变量,可以使用final和const,它们可以替代任何类型,只能在声明时初始化,且不能改变。

const a = 1;

final b =1;

final int c = 1;

const int d = 1;

​ final与const从使用上根本看不出区别,但是final是运行时常量,而const是编译器常量,它的值在编译期就可以确定,编译时常量能够让代码运行的更高效。


//正确,已经确定的值

const a = 1;

const b = a + 1;



//错误,final不能在编译时确定值,因此const也不能确定值

final a = 1;

const c = a + 1;



类的变量可以为 final 但是不能是 const 。如果 const 变量在类中,需要定义为static const静态常量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Vc8d2cQ-1651758327201)(图片/const成员.png)]

内置的类型


​ 与Java的八大内置基本数据类型不同,Dart 内置支持下面这些类型:

  • numbers

  • strings

  • booleans

  • lists (也被称之为 arrays)

  • maps

  • runes (用于在字符串中表示 Unicode 字符)

  • symbols

Numbers(数值)

num是数字类型的父类,有两个子类 intdouble

Strings(字符串)

​ Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串,单引号和双引号可以嵌套使用,否则需要使用\进行转义。字符串中也可以引用变量与表达式。


var name = 'tiger';

//如果插入一个简单的标识符,而后面没有紧跟更多的字母数字文本,那么{}应该被省略。

var a = "my name is $name!";

var b = "my name is ${name.toUpperCase()}!";



​ 与Java一样可以使用 + 操作符来把拼接字符串,也可以把多个 字符串放到一起来实现同样的功能:


var a  = "my name is " "tiger";



​ 使用三个单引号或者双引号可以 创建多行字符串对象


var s1 = '''

You can create

multi-line strings like this one.

''';



var s2 = """This is also a

multi-line string.""";



​ 提供一个 r 前缀可以创建一个 “原始 raw” 字符串


print(r"换行符:\n"); // 换行符:\n  r:不需要转义

print("换行符:\\n"); // 换行符:\n



Booleans(布尔值)

​ Dart 有一个名字为 bool 的类型。 只有两个对象是布尔类型的:truefalse 。这一点和Java没有太大的区别。

Lists(列表)

​ 几乎所有编程语言中最常见的集合可能是数组或有序对象组。在Dart中,数组就是List对象。对List进行遍历也和Java一样。


var list = [1, 2, 3];

//Lists 的下标索引从 0 开始,第一个元素的索引是 0. list.length - 1 是最后一个元素的索引

print(list[list.length-1]);

//修改元素

list[0] = 2;



//使用new(实际上new可以省去)

var list = new List(1);

list[0] = 2;



//在 list 字面量之前添加 const 关键字,可以 定义一个不变的 list 对象(编译时常量)

var list =  const [1,2,3];

i.add(2); ///错误,list不可变



Maps(映射集合)

​ Map:键值对相关的对象。 键和值可以是任何类型的对象。每个 键 只出现一次, 而一个值则可以出现多次。


//直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开

var companys = {'a': '阿里巴巴', 't': '腾讯', 'b': '百度'};

var companys2 = new Map();

companys2['a'] = '阿里巴巴';

companys2['t'] = '腾讯';

companys2['b'] = '百度';



//添加元素

companys['j'] = '京东';

//获取与修改元素

var c = companys['c']; ///没有对应的key返回null

companys['a'] = 'alibaba'; 



​ 与List一样,在 map字面量之前添加 const 关键字,可以 定义一个 编译时常量 的 map

Runes(用于在字符串中表示Unicode字符)

​ Unicode为世界上所有的书写系统中使用的每个字母,数字和符号定义了唯一的数值。 Dart 字符串是 UTF-16 位代码单元字符序列, 所以在字符串中表达 32位 Unicode 值需要 新的语法。Runes就是UTF-32字符集的string 对象。

​ 表达Unicode代码点的常用方法是\uXXXX,其中XXXX是4位十六进制值。要指定多于或少于4个十六进制数字,需要将值放在大括号中。


var clapping = '\u{1f44f}'; ///5个16进制 需要使用{}

print(clapping);//👏

//获得 16位代码单元

print(clapping.codeUnits); //[55357, 56399]

//获得unicode代码

print(clapping.runes.toList()); //[128079]



//fromCharCode 根据字符码创建字符串

print( String.fromCharCode(128079));

print( String.fromCharCodes(clapping.runes));

print( String.fromCharCodes([55357, 56399]));

print( String.fromCharCode(0x1f44f));



Runes input = new Runes(

  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');

print(String.fromCharCodes(input));



实际上在Flutter开发中Runes与下一个Symbols可能永远也不会用到。

Symbols

​ 操作符标识符,可以看作C中的宏。表示编译时的一个常量


var i = #A; //常量



main() {

  print(i);

  switch(i){

    case #A:

      print("A");

      break;

    case #B:

      print("B");

      break;



  }

  var b = new Symbol("b");

  print(#b == b); ///true

}



操作符


常见的操作符就没什么可说的了,主要来看看Java所没有的。

类型判定操作符

asis、 和 is! 操作符是在运行时判定对象 类型的操作符

| 操作符 | 解释 |

| — | — |

| as | 类型转换 |

| is | 如果对象是指定的类型返回 True |

| is! | 如果对象是指定的类型返回 False |

as 操作符把对象转换为特定的类型,但是如果无法完成转换则会抛出一个异常

is 和Java中的 instanceof 相同

赋值操作符

=+=\=*=这些不必多说,还有一个 ??= 操作符用来指定 值为 null 的变量的值


b ??= value; // 如果 b 是 null,则 value 赋值给 b;

             // 如果不是 null,则 b 的值保持不变



条件表达式

Dart 有两个特殊的操作符可以用来替代 if-else 语句:

  • condition ? expr1 : expr2

    如果 condition 是 true,执行 expr1 (并返回执行的结果); 否则执行 expr2 并返回其结果。

  • expr1 ?? expr2

    如果 expr1 不为null,返回其值; 否则执行 expr2 并返回其结果。

级联操作符

​ 级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量, 并且写出来的代码看起来 更加流畅:


//StringBuffer write就是Java的append

var sb = new StringBuffer();

sb..write('foo')..write('bar');



安全操作符

​ Dart提供了 ?.操作符。左边的操作对象 如果 为 null 则返回 null




### 面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

**《960页Android开发笔记》**

![](https://img-blog.csdnimg.cn/img_convert/3e42e25e4e44a15bdacf36718e6950d7.webp?x-oss-process=image/format,png)

**《1307页Android开发面试宝典》**

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

![](https://img-blog.csdnimg.cn/img_convert/39b4dac1e7726e5668fcfb81d3364f57.webp?x-oss-process=image/format,png)

**《507页Android开发相关源码解析》**

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

![](https://img-blog.csdnimg.cn/img_convert/4e0965d9d5d9c635b39185b2adae9ef0.webp?x-oss-process=image/format,png)



面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

[外链图片转存中…(img-mNojgk3U-1719162386219)]

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

[外链图片转存中…(img-viHBkYUm-1719162386220)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-L0I92nmQ-1719162386220)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值