flutter
入口程序
dart
官网与安装
https://dart.dev/get-dart
语言特点
- 万物皆对象,函数也是对象
- 指定类型不是必须的,是弱类型语言
- 代码在运行前解析
- dart 统一的程序入口 main
- 变量名和方法名前加下划线代表私有
- 高级语言
- 多继承
- 变量区别大小写
dynamic 与object 的区别
- object 是所有类型的基类,dynamic 更像是万能类型,可以赋值任意的对象
- dynamic 初始化时,系统就提供了类型的所有可能组合,可以直接调用这个类型的方法和属性,而object 需要强转
as 类型转换
main() {
dynamic t; //万用类型
Object b;
b=Dog();
t = Dog();
t.name="hhh";
t.eat();
final a=100; //使用时被初始化
const c=1000;//编译时常量
(b as Dog).eat(); //object的类型强转,类似于kt
//print();
}
基本数据类型(5种)
Number
- int
- double
String
- 双引号和单引号没什么区别
Boolean
List
Map
常量
const g = 123333;
final h = 1111;
final 和 const 的区别
- final是使用的时候初始化,const 是编译时常量
- 共同的功能是声明变量不可修改
NaN
int l;
l??=23;//如果l为null的话给l赋值为23
print(l);
const 与final 的区别
- final 可以开始不赋值,只能赋值一次
- final 有const的编译时常量的特性,最重要的它是运行时常量,具有惰性初始化->即运行时第一次使用时才初始化
函数
- 方法里可以嵌套方法,函数也是对象,函数可以作为参数传递给其他函数
- 方法形参的类型不一定要声明类型,此时默认当做dynamic 类型
bool isNums(int a){
return a!=0;
}
isNums2(int a){
return a!=0;
}
箭头函数
箭头函数后面是不能加代码块的,只能写一行语句,不能有分号
匿名函数
var jjj=(username,age,sex){
print("$username===$age===$sex");
};
jjj("hcy",22,33);
静态成员与静态方法
- 静态方法不能访问非静态的方法和属性
static
操作符
级联操作(…)
就是连续操作着一些方法,类似于lambda
Dog dogs = new Dog();
dogs
..name = "snb"
..age = "28"
..eat();
is 判断数据类型
判断是否属于某个类型
??
?.
如果不等于空就往下执行(类似kt)
Dog dogs=new Dog();
dogs?.eat();
闭包
全局变量,常驻内存,但可能污染数据
局部变量,不常驻内存,方法调用完,变量回收不污染数据
闭包的作用:使局部变量常驻内存。方法调用完不会被回收
fun() {
var a = 100;
return () {
a++;
print(a);
};
}
var v=fun();
print(v);
v();//101
v();//102
v();//103
(fun())();//101
(fun())();//101
(fun())();//101
对象
-基于mixin的继承方式:一个类可继承对个父类===多继承
-根父类Object
实例化对象
void test4(){
var man=Man("hcy2019",12);
man.eat();
}
私有属性和私有方法 _
class Animal {
var _sex = "nan";//私有属性
void _eat() {
print("====Animal=eat==");//私有方法
}
}
实例化成员变量
class Box {
int boxWeight;
String boxMadeInPlace;
}
- 默认了一个null构造方法
- 隐式定义了get,set方法。这点类似于kt与java的交集
构造函数
- 常规写法1
class Box {
int boxWeight;
String boxMadeInPlace;
Box(int boxWeight, String boxMadeInPlace) {
this.boxMadeInPlace=boxMadeInPlace;
this.boxWeight=boxWeight;
}
}
- 常规写法2 === 同样定义相同的构造函数会报错
class Box {
int boxWeight;
String boxMadeInPlace;
// Box(int boxWeight, String boxMadeInPlace) {
// this.boxMadeInPlace=boxMadeInPlace;
// this.boxWeight=boxWeight;
// }
Box(this.boxWeight, this.boxMadeInPlace);
}
- 常规写法3 命名构造函数
class Box {
int boxWeight;
String boxMadeInPlace;
// Box(int boxWeight, String boxMadeInPlace) {
// this.boxMadeInPlace=boxMadeInPlace;
// this.boxWeight=boxWeight;
// }
//Box(this.boxWeight, this.boxMadeInPlace);
Box.madeBox(int weight, String boxP) {
this.boxWeight = weight;
this.boxMadeInPlace = boxP;
}
}
类似于java的静态方法,但又似是而非
- 常规写法4
class Box {
int boxWeight;
String boxMadeInPlace;
Box(boxWeight, boxMadeInPlace)
: boxWeight = boxWeight,
boxMadeInPlace = boxMadeInPlace;
}
重载 operator
Mixins 混入功能 关键字with
- 类似于多继承,是一种全新的特性
- mixins的类不能有构造器
- 一个类可以mixins多个mixins类
- 作为mixins的类只能继承自object,不能继承其他类
- mixins 的类或者继承里的类里有同样的方法,后面的方法会替换前面的方法
class T = Dog with Box;
void main() {
//var box = new Box(100, "made in china");
//print("${box.boxMadeInPlace}=====${box.boxWeight}");
//box.tests(100);
// var dog=new Dog();
// dog.eat();
T t = new T();
t.tests(100);//类Box里的方法
t.eat();//类Dog里的方法
}
泛型 表示
泛型
泛型就是解决 类 接口 方法的复用性,以及对不特定数据类型的支持(类型校验)
泛型方法
T tes1t<T>(T value) {
return value;
}
继承
- 子类使用extends继承父类
- 子类会继承父类里所有的可见的属性和方法,但不能继承构造函数(父私有的属性和方法不能被子类引用的)
- 子类能复写父类的方法
抽象类
主要用于定义标准
- 抽象类不能被直接实例化,只有继承的子类才能被实例化
多态
子类的实例赋值给父类的引用
接口
普通类或抽象类都可以作为接口被实现
库
引入
- dart:xx dart语言提供的库文件
- package:xx 第三方的库文件
指定一个库的前缀 as
引用库的一部分
- show 只引用一点
- 除此之外都引用
异步
注释 基本与java一致
组件
一切皆组件
容器组件
图片组件
文本组件
图标及按钮组件
图标组件分类 | 功能 | 可否交互 |
---|---|---|
Icon(图标组件) | 展示图标 | 不可交互 |
IconButton 图标按钮组件 | 展示图标,响应事件 | 可以 |
RaisedButton 凸起按钮组件 | 触摸效果,响应事件 | 可以 |