安装
Dart官网
安装brew
Brew安装
执行代码
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
使用BREW安装Dart的SDK
$ brew tap dart-lang/dart
$ brew install dart
- 安装的过程如果有代理的,需要将代理关掉,不然会提示安装失败
检测Dart是否安装成功:dart info
使用vscode编写dart文件
- 需要安装两个插件:code runner 和 Dart
认识Dart
基本语法概述
- 常量:和js语法一致,均是使用const,但是多了一个final进行声明,比如:const pi = 3.1415 Or final PI = 3.14
- Dart是一种相对智能的语言,有自己的语法检测,比如定义了string类型,在后面重新赋值了int类型的情况会提示错误。
- Dart是区分大小写的,var str 和var STR 是两个变量
- Dart是严格使用分号的,结尾不加分号会报错
- 和js语法基本一致,可以使用var声明,Dart会根据赋值来判断类型,但是不支持Js的let声明,也同样适应java语法,使用数据类型进行声明,比如:String str = ‘hello’ int Num = 1234等
- Dart获取值是通过“${变量}”进行获取
- Dart中万物皆是Object
//自定义无参函数
int num() {
return 123;
}
//自定义必填参数函数
String UserInfos(String name, int age) {
return "姓名:$name 年龄:$age";
}
//自定义非必填参数函数 默认返回的是null 可选参数可以是多个,全部写在[]里面即可 当然也可以在参数里面直接默认赋值
String getUserInfos(String name, [String sex]) {
if (sex != null) return "姓名:$name 性别:$sex";
return "姓名:$name 性别保密";
}
//自定义一个命名参数
String ObjUserInfos(String name, {String sex}) {
return "姓名:$name 性别:$sex";
}
//入口函数
void main() {
print(num());
print(UserInfos("tom", 25));
print(getUserInfos("tom"));
print(ObjUserInfos("tom", sex: '男'));
}
main方法
变量、常量
函数
静态
class Info {
String name;
int age;
static String sex;
infoFun() {
return this.name; //使用this访问的是非静态属性
}
//静态方法不可以访问非静态的属性和方法
static String staFun() {
return sex; //不需要this,直接使用属性,调用静态方法也是一样的,直接调用就可以
}
}
void main() {
var i = new Info();
i.name;
i.age;
Info.sex; //静态的属性直接使用类进行访问
}
默认的get、set方法
class Areafun {
int height;
int width;
//构造函数第一种默认值的写法
//Areafun(this.height, this.width) {}
//构造函数第二种默认值有值的写法
Areafun()
: this.height = 10,
this.width = 4 {}
//还有一种默认的get set方法
get areavalue {
return this.height * this.width;
}
//默认的set方法
set areaNewValue(int value) {
this.height = value;
}
comArea() {
return this.height * this.width;
}
}
void main() {
var area = new Areafun();
print(area.comArea());
print(area.areavalue); //此时不需要加小括号
area.areaNewValue = 45;
print(area.areavalue);
}
闭包
void main() {
printInfo() {
var a = 123;
return () {
a++;
print(a);
};
}
var b = printInfo();
b();
b();
b();
}
递归
//匿名函数
var num = (int n) {
return n;
};
//递归函数
var sum = 1;
fn(int n) {
sum *= n;
if (n == 1) {
return false;
}
fn(n - 1);
}
//入口函数
void main() {
print(num(12));
//自执行函数
(() {
print('is Run');
})();
//调用
fn(8);
print(sum);
}
操作符
class Info {
String name;
int age;
Info(this.name, this.age) {}
printInfo() {
print("${this.name}:${this.age}");
}
}
void main() {
//常规写法
var p = new Info('张三', 20);
p.name = 'tom';
p.age = 26;
p.printInfo();
//连缀写法
p
..name = 'jim'
..age = 30
..printInfo();
}
类
class Person {
String name = 'tom';
int age = 23;
//构造函数
// Person() {
// print("我是构造函数,我被实例化的时候就会执行");
// }
Person(this.name, this.age) {
print("我是构造函数,我被实例化的时候就会执行");
}
//命名构造函数可以第一多个
Person.now() {
print("我是命名构造函数,我被实例化的时候就会执行");
}
Person.setInfo(name, age) {
print("我是命名构造函数,我被实例化的时候就会执行");
}
setInfo(int age) {
this.age = age;
}
getInfo() {
print('${this.name} , ${this.age}');
}
}
封装、私有变量、公有变量以及构造函数
//这是一个具有私有变量的类,似有变量是在前面加上下划线
class Animal {
String _name; //此时的name是似有变量
int _age;
String sex; //这个不加下划线的时候是一个共有的方法
Animal() {
print("我是初始化的时候就会执行的构造函数");
}
// 此时的getInfo的函数是一个共有的函数,可以将私有的属性return出去为共有的属性
String getInfo() {
return this._name;
}
//这是一个私有的函数
void _run() {
print('我是一个私有的函数');
}
//这是一个共有的函数,执行的是一个私有的函数
execFun() {
this._run();
}
}
//另一个文件可以通过import进行引入
import 'lib/Animal.dart';
void main() {
Animal a = new Animal();
a.sex;
a.execFun();
}
继承
class Person {
String name = 'tom';
int age;
String getInfo() {
return this.name;
}
}
//Child 继承了Person类,进而得到了Person的属性和方法,当然这是没有构造函数的情况
class Child extends Person {}
//具有构造函数的类
class Man {
String name;
int age;
String sex;
String getInfo() {
return this.name;
}
//构造函数
Man(this.name, this.age) {}
}
class Boy extends Man {
Boy(String name, int age, String sex) : super(name, age) {
this.sex = sex;
}
String exec() {
print("${this.name} --- ${this.age} --- ${this.sex}");
}
}
//复写父类的方法
class Animal {
String name = 'Dog';
void info() {
print("${this.name}");
}
}
class Dog extends Animal {
String name = 'sheep';
//重写父类的方法 这里不加@override也是可以的,一般会加上
@override
void info() {
print("${this.name}");
}
}
//子类调用父类的方法
class Factory {
String name = 'FAC';
void run() {
print('this is FAC');
}
}
//通过super关键字调用
class Famer extends Factory {
void info() {
super.run();
}
}
void main() {
Child c = new Child();
print(c.name);
Boy b = new Boy('tom', 20, '男');
b.exec();
Dog d = new Dog();
d.info();
Famer f = new Famer();
f.info();
}
多态
封装
抽象类
abstract class Animal {
eat();
printInfo() {
print('我是一个普通抽象类里面的普通方法');
}
}
class Dog extends Animal {
@override
eat() {
// TODO: implement eat
print('my name is animal');
}
}
class Cat extends Animal {
@override
eat() {
// TODO: implement eat
throw UnimplementedError();
}
}
void main() {
Dog d = new Dog();
d.eat();
d.printInfo();
}
接口和实现
abstract class Db {
String uri; //数据库的链接地址
add(); //数据库的增加方法
del(); //数据库的删除方法
update(); //数据库的更新方法
search(); //数据库的查询方法
}
abstract class Language {
String name;
}
class Mysql implements Db {
@override
String uri;
@override
add() {
// TODO: implement add
print('this is mysql');
}
@override
del() {
// TODO: implement del
throw UnimplementedError();
}
@override
search() {
// TODO: implement search
throw UnimplementedError();
}
@override
update() {
// TODO: implement update
throw UnimplementedError();
}
}
class Oracle implements Db {
@override
String uri;
@override
add() {
// TODO: implement add
print('this is oracle');
}
@override
del() {
// TODO: implement del
throw UnimplementedError();
}
@override
search() {
// TODO: implement search
throw UnimplementedError();
}
@override
update() {
// TODO: implement update
throw UnimplementedError();
}
}
//实现多个接口的时候,要同时实现里面的方法
class Impl implements Db, Language {
@override
String name;
@override
String uri;
@override
add() {
// TODO: implement add
throw UnimplementedError();
}
@override
del() {
// TODO: implement del
throw UnimplementedError();
}
@override
search() {
// TODO: implement search
throw UnimplementedError();
}
@override
update() {
// TODO: implement update
throw UnimplementedError();
}
}
void main() {
Mysql m = new Mysql();
m.add();
Oracle o = new Oracle();
o.add();
}
mixins
class A {
printInfoA() {
print('this is A');
}
}
class B {
printInfoB() {
print('this is B');
}
}
class D {
D() {}
printInfoD() {
print('this is D');
}
}
//可以实现继承和mixins同时使用
class C extends D with A, B {}
void main() {
C c = new C();
c.printInfoA();
}
泛型
//定义一个泛型的方法
T getData<T>(T value) {
return value;
}
//定义一个泛型类
class PrintClass<T> {
List list = new List<T>();
void add(T value) {
this.list.add(value);
}
printInfo() {
print(this.list);
}
}
//可以动态的传入类型
void main() {
getData('tom');
getData<String>('jim');
getData<int>(12);
//List默认的就是泛型的类
List list = new List<String>();
list.add('jim');
print(list);
List list1 = new List<int>();
list1.add(123);
print(list1);
PrintClass p = new PrintClass();
p.add('1234');
p.add(123);
p.printInfo();
}
库
自定义库
系统内置的库
实例接口:https://news-at.zhihu.com/api/3/stories/latest
Pub包管理系统中的库(第三方库)
name:'enlish',
description:'描述信息',
dependencies:'去地址里面的install中找安装的版本信息'
结尾
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!