enableFlags(bold: true);
匿名函数
多数函数是有名字的, 比如 main()
和 printElement()
。 也可以创建没有名字的函数,这种函数被称为 匿名函数, 有时候也被称为 lambda 或者 closure 。
如果匿名函数只有一条语句同样可以使用 =>简写
下面例子中定义了一个包含一个无类型参数 item
的匿名函数。 list 中的每个元素都会调用这个函数,打印元素位置和值的字符串。
var list = [‘apples’, ‘bananas’, ‘oranges’];
list.forEach((item) {
print(‘${list.indexOf(item)}: $item’);
});
闭包
闭包:既一个函数对象,即使函数对象的调用在它的原始作用域之外,依然能够访问在它次法作用域内的变量
返回值
所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null;
语句。
foo() {}
assert(foo() == null);
类型判定运算符
-
as 将对象强制转换为特定类型
-
is 是否是某种类型,相当于java instanceof
-
is! 是否不是某种类型
条件表达式
- condition ? expr1 : expr2
如果条件为 true, 执行 expr1 (并返回它的值): 否则, 执行并返回 expr2 的值。
- expr1 ?? expr2
如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。
级联运算符 (…)
级联运算符 (..
) 可以实现对同一个对像进行一系列的操作。
非空调用
如:a?.b
相当于 a == null ? null : a.b
三目赋值运算符
如:a ??= b
相当于 a = a == null ? b : a
整除
如:a ~/ b
等价于 (a /b) as int
if
and else
//和 JavaScript 不同, Dart 的判断条件必须是布尔值,不能是其他类型
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
for
loops
//方式一var message = StringBuffer(‘Dart is fun’);for (var i = 0; i < 5; i++) { message.write(‘!’);}//方式二candidates.forEach((candidate) => candidate.interview());//方式三var collection = [0, 1, 2];for (var x in collection) { print(x); // 0 1 2}
while
and do
-while
loops
while (!isDone()) { doSomething();}
do { printLine();} while (!atEndOfPage());
break
and continue
-
Break:停止循环
-
Continue: 跳转到下一次迭代
switch
and case
在 Dart 中 switch 语句使用 ==
比较整数,字符串,或者编译时常量。 比较的对象必须都是同一个类的实例(并且不可以是子类), 类必须没有对 ==
重写。 枚举类型 可以用于 switch
语句。
- 在
case
语句中,每个非空的case
语句结尾需要跟一个break
语句
assert
-
如果
assert
语句中的布尔条件为 false , 那么正常的程序执行流程会被中断。 -
assert 语句只在开发环境中有效, 在生产环境是无效的; Flutter 中的 assert 只在 debug 模式 中有效。
Dart 代码可以抛出和捕获异常。 异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。
Dart 提供了 Exception 和 Error 类型, 以及一些子类型。 当然也可以定义自己的异常类型。 但是,此外 Dart 程序可以抛出任何非 null 对象, 不仅限 Exception 和 Error 对象。
- 也可以throw 'beason is null’抛出任意对象
throw FormatException(‘Expected at least 1 section’);throw ‘Out of llamas!’;
- 使用On来制定类型,catch捕获,try{}on Exception catch(e){}
try { breedMoreLlamas();} on OutOfLlamasException { buyMoreLlamas();}
- catch函数可以制定1-2个参数,第一个为异常对象,第二个为堆栈信息
try { // ···} on Exception catch (e) { print(‘Exception details:\n $e’);} catch (e, s) { print(‘Exception details:\n $e’); print(‘Stack trace:\n $s’);}
- 不管是否抛出异常,
finally
中的代码都会被执行。 如果catch
没有匹配到异常, 异常会在finally
执行完成后,再次被抛出:
Dart 是一种基于类和 mixin 继承机制的面向对象的语言。 每个对象都是一个类的实例,所有的类都继承于 Object. 。 基于 * Mixin 继承* 意味着每个类(除 Object 外) 都只有一个超类, 一个类中的代码可以在其他多个继承类中重复使用。
使用类的成员变量
-
使用 (
.
) 来引用实例对象的变量和方法 -
使用
?.
来代替.
, 可以避免因为左边对象可能为 null , 导致的异常。 -
使用对象的
runtimeType
属性, 可以在运行时获取对象的类型,runtimeType
属性回返回一个 Type 对象。
类的定义用 class
关键字,如果未显式定义构造函数,会默认一个空的构造函数,这一点与 Java是一样的
通过 构造函数 创建对象。 构造函数的名字可以是 *ClassName*
或者 `ClassName.identifier
构造函数
默认构造函数
在没有声明构造函数的情况下, Dart 会提供一个默认的构造函数。 默认构造函数没有参数并会调用父类的无参构造函数。
构造函数不被继承
子类不会继承父类的构造函数。 子类不声明构造函数,那么它就只有默认构造函数 (匿名,没有参数) 。
命名构造函数
class Point { num x, y; Point(this.x, this.y); // 命名构造函数,可以有多个 Point.origin() { x = 0; y = 0; }}
重定向构造函数
有时构造函数的唯一目的是重定向到同一个类中的另一个构造函数。 重定向构造函数的函数体为空, 构造函数的调用在冒号 (😃 之后。
class Point { num x, y; // 类的主构造函数。 Point(this.x, this.y); // 指向主构造函数 Point.alongXAxis(num x) : this(x, 0);}
常量构造函数
如果该类生成的对象是固定不变的, 那么就可以把这些对象定义为编译时常量。 为此,需要定义一个 const
构造函数, 并且声明所有实例变量为 final
。
class ImmutablePoint { static final ImmutablePoint origin = const ImmutablePoint(0, 0); final num x, y; const ImmutablePoint(this.x, this.y);}
工厂构造函数
当执行构造函数并不总是创建这个类的一个新实例时,则使用 factory
关键字。 例如,一个工厂构造函数可能会返回一个 cache 中的实例, 或者可能返回一个子类的实例。
class Logger { final String name; bool mute = false; // 从命名的 _ 可以知, // _cache 是私有属性。 static final Map<String, Logger> _cache = <String, Logger>{}; factory Logger(String name) { if (_cache.containsKey(name)) { return _cache[name]; } else { final logger = Logger._internal(name); _cache[name] = logger; return logger; } } Logger._internal(this.name); void log(String msg) { if (!mute) print(msg); }}
工厂构造函数无法访问 this。
调用父类非默认构造函数
默认情况下,子类的构造函数会自动调用父类的默认构造函数(匿名,无参数)。 父类的构造函数在子类构造函数体开始执行的位置被调用。
执行顺序如下:
-
initializer list (初始化参数列表)
-
superclass’s no-arg constructor (父类的无名构造函数)
-
main class’s no-arg constructor (主类的无名构造函数)
抽象类
Dart 中并没有 interface
关键字,只有 abstract
来修饰"抽象类",但是,这里的抽象类既可以被继承(extends),也可以被实现(implements),但是抽象类不能实例化。如果希望抽象类能够被实例化,那么可以通过定义一个 工厂构造函数 来实现。
// 这个类被定义为抽象类,// 所以不能被实例化。abstract class AbstractContainer { // 定义构造行数,字段,方法… void updateChildren(); // 抽象方法。}
隐式接口
每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口。
扩展类(继承)
使用 extends
关键字来创建子类, 使用 super
关键字来引用父类
noSuchMethod()
当代码尝试使用不存在的方法或实例变量时, 通过重写 noSuchMethod()
方法,来实现检测和应对处理
除非符合下面的任意一项条件, 否则没有实现的方法不能够被调用:
-
receiver 具有
dynamic
的静态类型 。 -
receiver 具有静态类型,用于定义为实现的方法 (可以是抽象的), 并且 receiver 的动态类型具有
noSuchMethod()
的实现, 该实现与Object
类中的实现不同。
枚举类型
枚举类型也称为 enumerations 或 enums , 是一种特殊的类,用于表示数量固定的常量值。
-
枚举类中每一个值都有一个index getter方法,返回对应的索引
-
枚举类型不能被子类化,混合或者实现
-
枚举类型不能被显示实例化
Mixin
Mixin 是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系。具体理解可以看另一篇文章小白都能看懂的关于Mixin机制的理解
在 API 文档中你会发现基础数组类型 List 的实际类型是 List<E>
。 <…> 符号将 List 标记为 泛型 (或 参数化) 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。
定义
-
使用
<…>
来声明泛型 -
通常情况下,使用一个字母来代表类型参数, 例如
E
,T
,S
,K
, 和V
等。 -
List
定义的泛型*(或者 参数化) 类型,定义为List<E>
。
限制泛型类型
使用泛型类型的时候, 可以使用 extends
实现参数类型的限制
class Foo { // Implementation goes here… String toString() => “Instance of ‘Foo<$T>’”;}class Extender extends SomeBaseClass {…}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。
所以,长征路还长,大家还是好好地做个务实的程序员吧。
最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~
担。**
[外链图片转存中…(img-8OZtrjpG-1710679464575)]
[外链图片转存中…(img-NVr5DpEf-1710679464576)]
[外链图片转存中…(img-Vy2xmNIs-1710679464576)]
[外链图片转存中…(img-yoNjbqe2-1710679464576)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-uEjbXOq5-1710679464577)]
最后
代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。
所以,长征路还长,大家还是好好地做个务实的程序员吧。
最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~