Dart 基础语法笔记
Hello Dart
/**
* 1.main函数是dart入口
* 2.dart当中打印信息使用print函数
*/
main(List<String> args) {
// List<String> args -> 列表<String> - 泛型
print("Hello World");
}
变量声明
main(List<String> args) {
// 1.明确的声明
String name = "why";
// 2.类型推导(var/final/const)
// 类型推导的方式虽然没有明确的指定变量的类型, 但是变量是有自己的明确的类型
// 2.1.var声明变量
var age = 20;
// age = "abc"; //报错
age = 30;
// 2.2.final声明常量
final height = 1.88;
// height = 2.00; //报错
// 2.3.const声明常量
const address = "广州市";
// address = "北京市"; //报错
// 2.4.final和const的区别
// const必须赋值 常量值(编译期间需要有一个确定的值)
// final可以通过计算/函数获取一个值(运行期间来确定一个值)
// const date1 = DateTime.now(); 写法错误
final date2 = DateTime.now();
// final用于的更多一点
// p1和p2是不是同一个对象
// final p1 = Person("why");
// final p2 = Person("why");
// print(identical(p1, p2));
// 在Dart2.0之后, const可以省略
const p1 = const Person("why");
const p2 = const Person("why");
const p3 = const Person("lilei");
print(identical(p1, p2)); //true
print(identical(p2, p3)); //false
}
class Person {
final String name;
const Person(this.name);
}
字符串类型
main(List<String> args) {
// 1.定义字符串
var str1 = 'abc';
var str2 = "abc";
var str3 = """
abc
cba
nba
""";
// 2.字符串和表达式进行拼接
var name = "why";
var age = 19;
var height = 1.88;
// 强调: ${变量}, 那么{}可以省略
var message1 = "my name is $name, age is $age, height is $height";
var message2 = "name is $name, type is ${name.runtimeType}";
print(message1);
print(message2);
}
集合类型
main(List<String> args) {
// 1.列表List: [];
var names = ["abc", "cba", "nba", "cba"];
names.add("mba");
// 2.集合Set: {};
var movies = {"星际穿越", "大话西游", "盗梦空间"};
names = Set<String>.from(names).toList();
print(names);
// 3.映射Map
var info = {
"name": "why",
"age": 18
};
}
函数的基本使用
main(List<String> args) {
print(sum(20, 30));
}
// 返回值的类型是可以省略(开发中不推荐)
int sum(int num1, int num2) {
return num1 + num2;
}
函数的可选参数
main(List<String> args) {
sayHello1("why");
sayHello2("why", 18, 1.88);
sayHello3("why", height: 1.88);
}
// 必选参数: 必须传
void sayHello1(String name) {
print(name);
}
// dart中没有函数的重载
// 可选参数: 位置可选参数 - 命名可选参数
// 注意: 只有可选参数才可以有默认值
// 位置可选参数: [int age, double height]
// 实参和形参在进行匹配时, 是根据位置的匹配
void sayHello2(String name, [int age = 10, double height = 2]) {
}
// 命名可选参数
void sayHello3(String name, {int age = 10, double height = 3.14}) {
}
函数是一等公民
main(List<String> args) {
// 1.直接找到另外一个定义的函数传进去
// test(bar);
// 2.匿名函数 (参数列表) {函数体};
test(() {
print("匿名函数被调用");
return 10;
});
// 3.箭头函数: 条件, 函数体只有一行代码
test(() => print("箭头函数被执行"));
}
// 函数可以作为另外一个函数的参数
void test(Function foo) {
var result = foo();
}
void bar() {
print("bar函数被调用");
}
main(List<String> args) {
test((num1, num2) {
return num1 + num2;
});
var demo1 = demo();
print(demo1(20, 30));
}
typedef Calculate = int Function(int num1, int num2);
void test(Calculate calc) {
calc(20, 30);
}
Calculate demo() {
return (num1, num2) {
return num1 * num2;
};
}
赋值运算符
main(List<String> args) {
// 1.??=:
// 当原来的变量有值时, 那么??=不执行
// 原来的变量为null, 那么将值赋值给这个变量
var name = null;
name ??= "lilei";
print(name);
// ??:
// ??前面的数据有值, 那么就使用??前面的数据
// ??前面的数据为null, 那么就使用后面的值
var name1 = null;
var temp = name1 ?? "lilei";
print(temp);
}
级联运算符
main(List<String> args) {
// var p = Person();
// p.name = "why";
// p.run();
// p.eat();
// 级联运算符
var p = Person()
..name = "why"
..eat()
..run();
}
class Person {
String name;
void run() {
print("running");
}
void eat() {
print("eating");
}
}
for循环的使用
main(List<String> args) {
// 1.基础for循环
for (var i = 0; i < 10; i++) {
print(i);
}
// 2.遍历数组
var names = ["why", "cba", "cba"];
for (var i = 0; i < names.length; i++) {
print(names[i]);
}
for (var name in names) {
print(name);
}
}
类
类的定义
main(List<String> args) {
var p = Person("why", 18);
}
class Person {
String name;
int age;
// Person(String name, int age) {
// this.name = name;
// this.age = age;
// }
Person(this.name, this.age);
}
类的构造函数
main(List<String> args) {
// 1.创建Person对象
var p = Person.withNameAgeHeight("why", 18, 1.88);
// print(p.toString());
var p1 = Person.fromMap({
"name": "lilei",
"age": 18,
"height": 1.88
});
print(p1);
// 2.知识点: Object和dynamic的区别
// 父类应用指向子类对象
// Object和dynamic
// Object调用方法时, 编译时会报错
// dynamic调用方法时, 编译时不报错, 但是运行时会存在安全隐患
// Object obj = "why";
// print(obj.substring(1));
// 明确声明
// dynamic obj = 123;
// print(obj.substring(1));
}
class Person {
String name;
int age;
double height;
Person(this.name, this.age);
// Person(this.name, this.age, this.height);
// 命名构造函数
Person.withNameAgeHeight(this.name, this.age, this.height);
Person.fromMap(Map<String, dynamic> map) {
this.name = map["name"];
this.age = map["age"];
this.height = map["height"];
}
@override
String toString() {
return "$name $age $height";
}
}
类的初始化列表
main(List<String> args) {
var p = Person("why");
}
class Person {
final String name;
final int age;
Person(this.name, {int age}): this.age = age ?? 10 {
// this.age = 10;
}
}
重定向构造函数
main(List<String> args) {
var p = Person("why");
print(p.age);
}
class Person {
String name;
int age;
// Person(this.name): age = 0;
// 构造函数的重定向
Person(String name): this._internal(name, 0);
Person._internal(this.name, this.age);
}
常量构造函数
main(List<String> args) {
const p1 = Person("why");
const p2 = Person("why");
print(identical(p1, p2));
}
class Person {
final String name;
// final String age;
const Person(this.name);
// const Person(this.name, this.age);
}
工厂构造函数
main(List<String> args) {
final p1 = Person.withName("why");
final p2 = Person.withName("why");
print(identical(p1, p2));
}
// 普通的构造函数: 会自动返回创建出来的对象, 不能手动的返回
// 工厂构造函数最大的特点: 可以手动的返回一个对象
class Person {
String name;
String color;
static final Map<String, Person> _nameCache = {};
static final Map<String, Person> _colorCache = {};
factory Person.withName(String name) {
if (_nameCache.containsKey(name)) {
return _nameCache[name];
} else {
final p = Person(name, "default");
_nameCache[name] = p;
return p;
}
}
factory Person.withColor(String color) {
if (_colorCache.containsKey(color)) {
return _colorCache[color];
} else {
final p = Person("default", color);
_colorCache[color] = p;
return p;
}
}
Person(this.name, this.color);
}
类的setter和getter
main(List<String> args) {
final p = Person();
// 直接访问属性
p.name = "why";
print(p.name);
// 通过getter和setter访问
p.setName = "lilei";
print(p.getName);
}
class Person {
String name;
// setter
set setName(String name) => this.name = name;
// getter
String get getName => name;
}
类的继承
main(List<String> args) {
}
class Animal {
int age;
Animal(this.age);
}
class Person extends Animal {
String name;
Person(this.name, int age): super(age);
}
抽象类的使用
main(List<String> args) {
final s = Shape();
final map = Map();
print(map.runtimeType);
}
// 注意二: 抽象类不能实例化
abstract class Shape {
int getArea();
String getInfo() {
return "形状";
}
factory Shape() {
return null;
}
}
// 注意一:继承自抽象类后, 必须实现抽象类的抽象方法
// class Rectangle extends Shape {
// @override
// int getArea() {
// return 100;
// }
// }
隐式接口
main(List<String> args) {
}
// Dart中没有哪一个关键字是来定义接口的
// 没有这些关键字interface/protocol
// 默认情况下所有的类都是隐式接口
// Dart支持单继承
// 当将一个类当做接口使用时, 那么实现这个接口的类, 必须实现这个接口中所有方法
class Runner {
void running() {
}
}
class Flyer {
void flying() {
}
}
class Animal {
void eating() {
print("动物次东西");
}
void running() {
print("running");
}
}
class SuperMan extends Animal implements Runner, Flyer {
@override
void eating() {
super.eating();
}
@override
void flying() {
}
}
mixin混入的使用
main(List<String> args) {
final sm = SuperMan();
sm.running();
sm.flying();
}
mixin Runner {
void running() {
print("runner running");
}
}
mixin Flyer {
void flying() {
print("flying");
}
}
class Animal {
void eating() {
print("动物吃东西");
}
void running() {
print("animal running");
}
}
class SuperMan extends Animal with Runner, Flyer {
@override
void eating() {
super.eating();
}
void running() {
print("SuperMan running");
}
}
类属性和类方法
main(List<String> args) {
Person.courseTime = "8:00";
print(Person.courseTime);
Person.gotoCourse();
}
class Person {
// 成员变量
String name;
// 静态属性(类属性)
static String courseTime;
// 对象方法
void eating() {
print("eating");
}
// 静态方法(类方法)
static void gotoCourse() {
print("去上课");
}
}
枚举的使用
// 枚举: enum
main(List<String> args) {
final color = Colors.red;
switch (color) {
case Colors.red:
print("红色");
break;
case Colors.blue:
print("蓝色");
break;
case Colors.green:
print("绿色");
break;
}
print(Colors.values);
print(Colors.red.index);
}
enum Colors {
red,
blue,
green
}
库的使用
使用系统的库.
// import 'dart:io';
// import 'dart:isolate';
// import 'dart:async';
// import 'dart:math';
// 1.系统的库: import 'dart:库的名字';
import 'dart:math';
main(List<String> args) {
final num1 = 20;
final num2 = 30;
print(min(num1, num2));
}
使用自定义库
export 'math_utils.dart';
export 'date_utils.dart';
/**
* 1.补充一: as关键字给库起别名
* 2.补充二: 默认情况下载导入一个库时, 导入这个库中所有的内容
* * show: 执行要导入的内容
* * hide: 隐藏某个要导入的内容, 导入其它内容
* 3.公共的dart文件的抽取: export
* 4.
*/
// import 'utils/math_utils.dart' as mUtils;
// import "utils/math_utils.dart" show sum, mul;
// import "utils/math_utils.dart" hide mul;
// import 'utils/date_utils.dart';
import "utils/utils.dart";
main(List<String> args) {
// print(sum(20, 30));
print(sum(20, 30));
// print(mul(20, 30));
print(dateFormat());
min(20, 30);
}
使用第三方库
name: coderwhy
description: a dart library
dependencies:
http: ^0.13.4
- 在控制台执行指令:pub get 进行安装
- 导入使用:
import 'package:http/http.dart' as http;
main(List<String> args) async {
var url = 'http://123.207.32.32:8000/home/multidata';
var response = await http.get(url);
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
}