炫酷的dart

花了几个小时简单了解了下dart

准备为flutter的学习打基础

总览

int 的默认值是 null
类里面的属性为null编译不给过

命名规则

类:大驼峰
公共方法属性:小驼峰
私有属性方法:_小驼峰

操作符

~/ 整除

5 ~/ 2 //返回2

??= 如果空则赋值,2.x好像失效了

int b;
b??=23;

..级联运算符

.运算符可以调用类里面的成员,如果返回的是同一类则可以链式调用
而..就很炫酷了,你可以省略掉类名连续调用,也就说不用特意为了链式调用设计成让方法返回类型本身

void main() {
A()
..print1()
..print2()
..print3();
}
class A {
print1() {
print(1);
}
print2() {
print(2);
}
print3() {
print(3);
}
}

三目运算

bool flag = true;
int num = flag ? 1 : 2;

??运算符

var a;
var b = a ?? 10; //a为空返回10

包导入

导入后即可方法文件内的类和函数

import 'lib/Persion.dart'

变量定义

使用var或者具体类型声明

var a = 1;
int b = 1;
//使用 final或const定义不可变
//final 可以变一次,const 编译时常量
//使用 late 修饰表示一个可空的变量

一些类型

double c = 1.0;
String d = '${a}'; //$是模板插值,字符串可以使用''或者""
//可空
String? name;
//list
var list = [1,"2","3"];
list.add("aa");
list.add(1);
//强制类型的list
List<int> list = [];
List<int> list = [1,2, 3];
//maps
var p = {"name": "jake", "age": 11};
var p2 = new Maps();
p2["age"] = 1;
//类型判断,转换
var str = "";
print(str is String);
try {
print(double.parse(str));
} catch (e) {
print(e);
}
print(1.toString());
print(''.isEmpty);
print(data.runtimeType); //查看类型

枚举

enum Color { red, green, blue }

属性成员初始化不可以为空,为空无法通过编译

void main() {
Persion.eat();
new Persion.eat();
}
class Person {
String name = "";
int age = 0;
//静态成员,通过类名获取
static int aaa = 1;
//构造函数初始化赋值,第一次看这个写法非常疑惑,后来才想起c#写构造函数赋值的痛处
Person(this.name, this.age) {}
//构造器初始化列表,这倒是不太习惯
Person()
: name = "1",
age = 2 {
print(222);
}
//命名构造函数
Person.eat() {
print("这是命名构造函数");
}
//getter setter
get height {
return 1;
}
String _sex = "";
set sex(String value) {
_sex = value;
}
}

类型初始化

初始化类 new Person(),或者省略new直接 Person()

继承 extends

super表示父类的构造函数

void main() {
Person p = Man(1);
print(p.name);
}
//继承
class Man extends Person {
Man(int age) : super(age);
}
class Person {
String name = ";";
Person(int age) {
print("父类的构造器");
}
}

抽象类

abstract class Animal {
eat();
void run(){
print("run")
}
}
class Dog extends Animal {
@override
eat() {
print("我吃屎");
}
}

接口 implements

实现多个接口使用逗号分割 class A implements B,C

abstract class ORM {
add();
delete();
update();
}
class Mysql implements ORM {
//必须完全实现上面三个方法
}

mixins 不是继承也不是接口,我称他为:类合并器

void main() {
C().printInfo();
}
//合并2个类的成员,相同会被后面的覆盖
class C with A, B {}
class A {
void printInfo() {
print('A');
}
}
class B {
void printInfo() {
print('B');
}
}

方法

void 是返回类型,可以不写,编译器会自动推断你的返回值

//[]包裹的是可选参数和默认参数
void printInfo(String name, [int? age, int height = 10]) {
print("${name},${age},${height}");
}
//{}包裹的是命名参数
void printInfo2(String name, {int? age, int height = 10}) {
print("${name},${age},${height}");
}
printInfo("tom"); //tom,null,10
printInfo2("jake56", age: 20, height: 111); //jake56,20,111

方法当参数传入

//方法当参数传入
void doWork1() {
print("--1");
}
void doWork2(String name) {
print(name);
}
void wrap(fn1, fn2(String n), String name) {
fn1();
fn2(name);
}
wrap(doWork1, doWork2, "aa"); //先打印--1,再打印aa

箭头函数, =>只能接一行戴安

var a = 1;sau
var fn1 = (int n) => print(a += n);
fn1(5);

定义完函数直接调用

((n) {
print(n);
})(200);

泛型

void main() {
getData<int>(12);
getData<String>('AA');
}
//泛型方法
T getData<T>(T value) {
return value;
}

不学了 不学了 头秃了

posted @   trykle  阅读(91)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示