最近flutter发展的如火如荼,而Dart做为flutter的开发语言,了解一下伐?html
dart 中一切皆对象 dart这个特征和java很像,全部变量、方法都是对象,那怕仅仅是个数字或字符串前端
在dart项目中,必须声明一个入口函数main,这也很java,程序从main函数开始运行(习惯使用js的须要注意这一点)。java
void main(){
print('hello dart!')
}
复制代码
int i = 2;
i = '3' ; // error:i为int类型,不能赋值字符串类型
复制代码
var i;
i = 2;
i = 3;
i = '4'; // error: var 变量赋值后,类型不能再改变
复制代码
dynamic d = 1;
d = '123'; // 变量类型肯定后还能够再赋值其余类型
复制代码
final a = 1;
a = 2; // error: final变量只能赋值一次,再次赋值报错
final b = [2];
b[0] = 1;
b.add(2); // final 虽然不能再次赋值,可是能够改变他成员变量的值
复制代码
const a = 1;
a = 2; // error: const变量只能在初始化时赋值
const b = [2];
b.add(2); // error: const 变量中的成员变量也不可再次改变
复制代码
// 方法定义,明确入参和出参,编译时能够作类型校验,提早发现一些错误
int add(int m, int n) {
return m + n;
}
void main() {
int a = add(50, 30);
String b = add('50', 30); // error: 入参类型和出参类型不正确,编译不经过
}
复制代码
// 出参和入参的类型能够忽略,若是忽略,编译时没法进行类型检查
add( m, n) {
return m + n;
}
void main() {
int a = add(50, 30);
String b = add('50', 30); // 能够经过编译,但在运行时会报异常
}
复制代码
// 可选位置参数
// 可选参数后面不能再有参数
int add(int m, [int n]) {
int sum = m;
if (n != null) {
sum += n;
}
return sum;
}
void main() {
print(add(1));
print(add(1, 2));
}
复制代码
// 可选命名参数
int add({int m, int n}) {
int sum = 0;
if (m != null) {
sum += m;
}
if (n != null) {
sum += n;
}
return sum;
}
void main() {
print(add());
print(add(m: 1));
print(add(n: 2));
print(add(m: 1, n: 2));
}
复制代码
// 默认参数值
// 默认值只能给可选参数设置
// 位置可选参数匹配顺序是从左到右的,即使有默认参数值
int add(int m, [int n = 0, int i]) {
var sum = m + n;
if (i != null) {
sum += i;
}
return sum;
}
void main() {
print(add(1));
print(add(1, 2));
}
复制代码
// => 函数
void main() {
var add = (int m, int n) => m + n;
var sub = (int m, int n) => return m - m; // error: ruturn 是代码语句,箭头函数不能使用代码语句
add(1 , 2);
}
复制代码
// 匿名函数
void main() {
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((i) {
print(list.indexOf(i).toString() + ': ' + i);
});
}
复制代码
也可使用箭头函数为高阶方法传参// 匿名函数
void main() {
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
// 转换为箭头函数时,要去掉语句后面的分号,
// 有分号就是语句,没有分号就变成了表达式,符合箭头函数要求
list.forEach((i) => {print(list.indexOf(i).toString() + ': ' + i)});
// 或
list.forEach((i) => print(list.indexOf(i).toString() + ': ' + i));
}
复制代码
// 静态做用域
int a = 5;
class Test {
int a = 6;
int getA() {
return a;
}
}
void main() {
var obj = new Test();
print(obj.getA()); // 6
var fun = obj.getA;
print(fun()); // 6
}
复制代码
void main() {
print('5/2 = ${5 / 2}'); // 5/2 = 2.5
print('5~/2 = ${5 ~/ 2}'); // 5~/2 = 2
}
复制代码
void main() {
num a = 123;
// print(a.isOdd); // error: isOdd 不是num的成员变量
print((a as int).isOdd);// isOdd 是int的成员方法,全部a必须转换成int类型后再调用
print('a is not String ? ${a is! String}'); // a is not String ? true
print('a is int ? ${a is int}'); // a is int ? true
}
复制代码
void main() {
var a;
a ??= 1; // 赋值前a = null,赋值后 a=1
a ??= 2; // 赋值前 a = 1, 赋值后 a=1
print(a); // 1
}
复制代码
void main() {
var a;
var b = 1;
print(a ?? b); // 1
a = 0;
print(a ?? b); // 0
}
复制代码
..
)能够在同一个对象上连续调用多个函数及访问成员变量// '..'不一样于'.',不要求函数有返回值,'..'至关于普通函数执行后返回‘this’
class Car {
void move(String direction, double distance) {
print('小汽车向${direction}行驶了${distance} 公里');
}
Car run(String direction, double distance) {
print('小汽车向${direction}行驶了${distance} 公里');
return this;
}
}
void main() {
Car car = new Car();
car..move('东', 3)..move('南', 4)..move('西', 4)..move('北', 4);
car..move('东', 3)..run('西', 3)..run('北', 4).run('西', 4).run('北', 4);
}
复制代码
void main() {
int a;
// print(a.isOdd); // error: a未赋值,不能访问成员变量和成员函数
print(a?.isOdd);
// 至关于
if (a == null) {
print(null);
} else {
print(a.isOdd);
}
}
复制代码
void main() {
int a = 1;
print(a is Object); // true
}
复制代码
class Tiger extends Animal implements Fly, Swim {
// todo
}
class Dog extends Animal {
// todo
}
复制代码
class Test {
int a;
// 至关于
// int _a;
// int get a => _a;
// set a(int val) => this._a = val;
}
复制代码
class Parent {
String name;
Parent(this.name);
}
class Child extends Parent {
Child(String name) : super(name);
Child.create(String name) : super(name);
}
void main(){
var zhangsan = Child('张三');
var lisi = Child.create('李四');
}
复制代码
abstract class Animal {
// 抽象方法
void moving();
}
复制代码
class Animal {
final String name;
Animal(this.name);
void moving() {
print('${this.name}正在移动');
}
}
abstract class Fly {
// 抽象方法
void fly();
}
class Tiger extends Animal implements Fly {
Tiger() : super('老虎');
@override
void fly() {
print('如虎添翼');
}
}
复制代码
class Calculator {
static int Add(int m, int n) {
return m + n;
}
}
void main(){
print(Calculator(1, 2));
}
复制代码
import
来引入库import 'dart:schema'
,如:import 'dart:io';
import 'package:schema'
, 如:import 'package:utils/utils.dart';
as
来指定库前缀,如 import 'package:utils/utils.dart' as utils;
show
和 hide
来部分导入库deferred as
延迟加载一个库dart:core
提供了基础类型、集合和其余少许可是很是核心的功能,dart应用会自动导入这个库。dart:convert
提供了一些用来转换 JSON 和 UTF-8 的转换器,还能够自定义 新的转换器。dart:async
异步编程一般使用回调函数,可是 Dart 提供了另外的 选择: Future 和 Stream 对象。dart:html
为基于web的应用提供了操做Dom元素和使用HTML5 API的功能。dart:math
提供了经常使用的数学运算功能。dart:io
提供了一下文件读写、进程访问、sockets等相关的功能,只有命令行应用可使用。pub相似于node的npm,用于管理dart应用的包,详情参见pub.dev/node
了解了上面这些基础语法,基本上就能够看懂一些dart示例和源码了,想有所成,了解这些仍是远远不够的,可是这些能够做为一个开始,做为学习dart的起点。web
快狗打车前端团队专一前端技术分享,按期推送高质量文章,欢迎关注点赞。
文章同步发布在公众号哟,想要第一时间获得最新的资讯,just scan it !npm