- Dart基本语法
// 程序入口
void main(List<String> args) {
print("hello world");
}
1.1 声明变量
//明确声明一个字符串变量
String name = "yzk";
//类型推导方式
var age = 30;
//声明常量
//const和final区别:const在编译期间必须要有一个确定的值;final可以在运行期间确定值
final pi = 3.14;
const city = "北京市";
1.2字符串类型
// 定义字符串
var str1 = 'abc';
var str2 = "abc";
var str3 = """
abc
def
xyz
"""
// 字符串拼接
var name = "yzk";
var age = 10
var height = 100
// ${变量名} 也可以省略{}
var message = "my name is ${name}, age is $age, height is $height";
1.3 集合类型
// List列表
var names = ["张三", "李四", "王五"];
//Set集合
var games = {"王者荣耀", "刺激战场", "英雄联盟"}
//Map映射(字典)
var hero = {
"name" : "鲁班",
"hp" : 50,
"mp" : 50
}
- 函数使用
返回类型
方法名(参数类型
参数名
,...) {}
// 返回值可以省略(开发中不推荐,容易挨揍)
int sum(int num1, int num2) {
return num1 + num2;
}
// 必选参数
void test1(String str) {
}
// Dart中没有函数重载,不能定义方法名相同,方法签名不一样的函数
// 位置可选参数,调用的时候必须按顺序传值也可以省略,但是只能省略右面的,只有这样赋值的时候才不会歧义
void test2(String str, [int? age, double? height]) {
}
// 命名可选参数
// 调用时名字不能省略,参数顺序可以任意(推荐使用这种方式)
void test3(String str, {int? age, double? height}) {
}
2.1 函数式
// 函数可以做为另一个函数的参数
void main(List<String> args) {
test(add);
//匿名函数
test(() {
print("匿名函数");
});
//箭头函数,条件是函数体只有一行代码
test(() => print("箭头函数"));
}
void test(Function foo) {
}
void add() {
}
// 使用Function作为参数,不能约束是否一定要传参数或参数类型
// 例如:
void main(List<String> args) {
// 调用
test(name);
test2((n1, n2) {
print(n1);
print(n2);
});
}
void test(Function foo) {
// 这时候就不能约束参数和类型了
foo();
foo("yzk");
foo(123);
}
void name(String n) {
}
//转变成这种写法
void test2(void foo(int n1, int n2)) {
foo(20, 30);
}
// 优雅的写法
typedef Calculate = void Function(int n1, int n2);
void test3(Calculate calculate) {
calculate(100, 200);
}
- 特殊的运算符
//赋值运算符
//当name是null的时候,执行赋值操作
var name;
name ??= "yzk";
// 当name1是null时,把??后面的赋值给temp
// 当name1非null时,把??前面的赋值给temp
var name1;
var temp = name1 ?? "yzk";
- 面向对象
4.1 类的定义
class Person {
}
4.2 构造函数
class Person {
String? name;
int? age;
double? height;
Person(this.name, this.age);
// 命名构造函数
Person.whith(this.name, this.age, this.height);
Person.forMap(Map<String, dynamic> map) {
this.name = map["name"];
this.age = map["age"];
this.height = map["height"];
}
}
// 构造函数成定向
class Person {
String name;
int age;
// 构造函数重定向
Person(String name): this.internal(name, 0);
Person.internal(this.name, this.age);
}
// 常量构造函数
void main(List<String> args) {
const p1 = Person("yzk");
const p2 = Person("yzk");
print(identical(p1, p2));
}
class Person {
final String name;
const Person(this.name);
}
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 p1 = Person(name, "default");
nameCache[name] = p1;
return p1;
}
}
factory Person.withColor(String color) {
if (colorCache.containsKey(color)) {
return colorCache[color]!;
} else {
final p1 = Person("default", color);
colorCache[color] = p1;
return p1;
}
}
Person(this.name, this.color);
}
4.3 类的setter
getter
方法
void main(List<String> args) {
final p = Person();
//直接访问属性
p.name = "yzk";
print(p.name);
//通过getter和setter
p.setName = "zk";
print(p.getName);
}
class Person {
String? name;
set setName(String name) => this.name = name;
String get getName => name!;
}
4.4 类的继承
class Animal {
int age;
Animal(this.age);
}
class Person extends Animal {
String name;
Person(this.name, int age): super(age);
}
4.5 抽象类
abstract class Shape {
int getArea();
String getInfo() {
return "形状";
}
}
// 继承自抽象类后,必须实现抽象类的抽象方法
// 抽象类不能被实例化
class Rectangle extends Shape {
@override
int getArea() {
return 100;
}
}
4.6 隐式接口
// Dart中没有哪一个关键字来定义接口
// 默认情况下所有类都是隐式接口
// Dart是单继承的
// 当一个类做为接口使用时,必须实现这个接口中所有的方法
class Runner {
void running() {
}
}
class Flyer {
void flying() {
}
}
class SuperMan implements Runner, Flyer {
@override
void running() {
}
@override
void flying() {
}
}
4.7 类属性和类方法
class Person {
// 成员变量
String? name;
// 静态属性(类属性)
static String? courseTime;
// 对象方法
void eating() {
print("eating");
}
// 静态方法(类方法)
static void test() {
print("test");
}
}
4.7 枚举
void main(List<String> args) {
final color = Colors.red;
switch (color) {
case Colors.red :
print("红色");
break;
case Colors.green:
print("绿色");
break;
case Colors.blue:
print("蓝色");
break;
}
print(Colors.values);
print(Colors.red.index);
}
enum Colors {
red,
green,
blue
}
- 库的使用
// 系统的库:import 'dart:库的名称'
import 'dart:io';
import 'dart:isolate';
import 'dart:async';
import 'dart:math';
// 第三方库
// 1. 创建pubspec.yaml文件
name: yzk
description: a dart library
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
http: ^0.13.5
// as 给第三方库起别名
import 'package:http/http.dart' as http;
网友评论