is 的结果取反
import 'dart:math' as math; // 这里导入库时使用as指定了别名 class Person { String name; Person(); say() { print("person say $name"); } } class User extends Person { String password; User(this.password); run() { print("user run"); } } void main() { print(math.max(4, 5)); // 指定别名的库调用 User u = User("password"); print(u is User); // true u.name = "name"; u.run(); // user run Person p = u as Person; // 通过as将子类型强转为父类型 print(p is User); // true print(p is Person); // true print(p is List); // fasle p.say(); // person say name // p.run(); // 错误,已经被转换成了Person, 不能再调用User的方法 } 流程控制语句流程控制与其他语言相同,这里简单列举
if .. else if..else
for
while、do..while
break、continue
switch .. case
assert
assert表示断言,判断一个表达式的真假,若为假则抛出一个异常
模块化dart支持模块化编程,可以导入dart内置库,其他三方库,也可以将自己的代码拆分成不同模块。
导入
导入内置库
import "dart:math";导入三方库
需要在项目描述文件pubspec.yaml(类似js中的package.json或者java的pom.xml)中声明你要依赖的库,然后安装,最后导入。
pubspec.yaml
dependencies: http: ^0.12.0+2安装
pub get导入
import 'package:http/http.dart';导入本地文件
导入本地的文件后可以使用其中定义的类,变量,函数等
import '../common/Utils.dart';导入时指定别名
相当于将一个库导出的东西挂到一个对象,可以解决重名问题(上边讲as有提到)
import 'package:http/http.dart' as http;条件导入
可以只导入指定内容,或者不导入某些内容
import 'package:lib1/lib1.dart' show foo; import 'package:lib2/lib2.dart' hide foo;动态导入或者按需加载
可以在运行时导入依赖,针对web应用,类似webpack的按需加载。
创建库
内容较多,此处略过,笔者也尚未研究,可参考官网
dart内置库介绍
dart:core
dart核心内库,默认导入,类似java的java.lang包。提供内置数据类型等。
dart:async
异步支持库,大名鼎鼎的Future就在这里边。
dart:math
复杂数学计算相关
dart:convert
json序列化、反序列化,字符集转换相关。
dart:html
web应用相关api
dart:io
io相关,与发请求相关的HttpClient在这里边
函数函数可以在顶层,也就是不属于任何一个类
函数可以是类的成员方法
可以有返回值也可以没有
函数是对象,可以赋值给变量,可以作为参数或返回值
参数可以是常见的位置参数,也可以是命名参数,命名参数传递时不必考虑顺序,命名参数大多数语言没有,听说是从oc借鉴过来的
只有一条语句的函数可以使用箭头函数
可以使用typedef定义特定的函数类型
函数参数可以指定默认值
// 没有返回值的函数 import 'package:flutter/foundation.dart'; void printInfo(String name, int age) { print('$name:$age'); } // 有返回值的函数 String getInfo(String name, int age) { return '$name:$age'; } // 函数作为参数传递 void excuteFn(var function, String name, int age) { function(name, age); } // 返回一个函数 Function getPrintInfoFn(int age) { return (String name) { print('$name:$age'); }; } // 函数体只有一条语句,可以使用箭头函数 void printInfo2(String name, int age) => print('$name:$age'); // 可以使用命名参数 void printInfo3({String name, int age}) { print('$name:$age'); } // 位置参数和命名参数混用,指定默认值 void printInfo4(String name, { int age}) { print('$name:$age'); } // 定义一种函数类型 typedef PrintFn = void Function(String name, int age); // 将特定类型的函数作为参数传递 void excuteFn2(PrintFn function, String name, int age) { function(name, age); } class User { // 函数作为类的成员方法 say() { print("hello"); } } void main() { printInfo("张三", 18); print(getInfo('李四', 18)); User user = User(); user.say(); excuteFn(printInfo, "王五", 18); Function fn1 = getPrintInfoFn(19); fn1("小明"); fn1("小花"); printInfo("小张", 18); printInfo2('小李', 20); printInfo3(name: "小华", age: 21); // 命名参数函数调用方式 printInfo4("AA"); printInfo4("aa", age: 30); excuteFn2(printInfo, "王五", 18); } 注释单行注释
// 我是一行注释多行注释
/** * 多行注释 * 多行注释 */文档注释
/// 文档注释 /// 文档注释 面向对象 类的定义与组成类使用class关键字定义
一个类可以由如下部分组成:
普通成员变量
静态成员变量
普通方法
静态方法
构造函数,不声明的话默认有无参构造
命名构造函数
set,get方法
说明
不支持重载
静态成员不用实例化即可访问,只能通过类名访问,不像java可以通过实例访问静态成员变量
静态成员方法中不能使用this,且只能访问静态成员变量
不写set,get方法会有默认的set,get方法