一、Dart中的变量与常量
1.变量
1.var类型是任意数据类型,一旦赋值类型就会确定不可以在更改,确定类型的时间是在编译结束以后 2.强制变量的类型比如String value = "今天是清明节";
dynamic和Object
2、常量
不可变的变量例如一些配置项,对于不可变的变量可以使用final和const关键字,final修饰的关键字声明的变量为最终变量,const修饰的关键字为最终常量
final和const区别:
- final 与 const 修饰的变量取值时机不同。 const编译时常量,final是运行时常量(在第一次使用时被初始化),可以理解为’懒加载’
- final可修饰实例变量、const不可以修饰实例变量,类级别的常量,通常用
static const - 应用范畴不同,final 只可用来修饰变量const 关键字即可修饰变量也可用来修饰 常量构造函数
- 相同内容对象创建不同。内存中重复创建值,相同时final在内存中重复创建,const会引用相同值
class A{
static const B = 0;
}
print(A.B)
class A{}
final A a = new A();
final和const相同点:
- 都必须初始化
final height = 10; - 类型声明可以省略
final String a = 'abc'; ,final a = 'abc'; - 初始化后就不能进行赋值
final a = 'aaa';a = 'abc'; 错误 - 不能和var同时使用
final var a = 'abc';’ 错误
3、 dynamic和Object
Object 是dart所有对象的根基类,也就是说所有类型都是Object 的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象
dynamic 与var一样都是关键词,声明的变量可以赋值任意对象.而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型.
不同点: dynamic与Object不同的是,dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用Object的属性与方法, 否则编译器会报错. 如:
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
print(a.length);
print(b.length);
}
二、基本数据类型
- Dart 中 number 类型分为 int 和 double
- 以bool代表布尔值,只有两个对象是布尔类型的,那就是true和false所创建的对象,这两个对象都是编译时常量。
- String字符串
- List数组
- Map集合
三、Dart函数和运算符
dart中的函数和JavaScript中有点类似。你需要定义就是函数的名字、返回值(有返回值或者void)、参数。
void test(){
var name = fullName('可可', '吃货');
print(name);
}
String fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
命名参数 dart有个叫命名参数的东西。当你调用函数的时候,你必须指定参数的名字。要使用命名参数,可以将函数的参数包括在花括号{}内
- 算术运算符
- 比较运算符
- 复合运算符
- 逻辑运算符
- 位运算符
- 条件运算符
- 级联运算符
- 点运算符
var a = 9;
print(a??"10");
print(a??="10")
class A{
String name;
}
var p = A();
p.name="";
p?.a
四、分支语句
- if和else
- for循环
- while循环
- break和continue
- switch和case
- 异常处理
switch(20){
case:10
print("");
}
异常处理
五、Dart面向对象
1.使用函数
- 自定义函数
- 定义可选参数
class A{String name;A({this.name}); } - 函数可选默认值
class A{String name;A({this.name=李白“”}); } - 匿名函数
((){}) - 词法作用域(作用域可以防止变量被污染)
- 闭包(闭包也是函数,离开变量作用域会失效)
2.Dart中的类
构造函数: 构造方法通常与类名相同,this指向当前实例化对象
- 普通构造函数
var cat = new Cat("逗比", 12);
class Cat {
String name;
int age;
Cat(String name, int age) {
this.name = name;
this.age = age;
}
}
- 命名构造函数
Map map = new Map();
map['name']= "哈巴狗";
map['age'] = 5;
Dog d = new Dog.newBorn(map);
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn(Map json) {
name = json['name'];
age = json['age'];
}
}
继承类:可以使用extends关键字继承其他的类 调用父类中的普通构造方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
void getName(){
super.getName();
print("name:${name}");
}
}
调用父类中构造方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
Teacher(String name):super(name);
}
重载和重写:@override 重写父类方法
class People{
String name;
void getName(){
print("name:${name}");
}
}
class Teacher extends People{
@override
void getName(){
print("");
}
}
多类继承Mixin(拓展类) dart中只支持单继承,但是想要继承多个类怎么办呢,Dart中的Mixins通过创建一个新类来实现,该类将mixin的实现层叠在一个超类之上以创建一个新类
class A{}
class B{}
class C extends A with B{}
Mixin不能实现构造方法,否则不能够被其他类所混合。作为Mixin的类虽然不能够定义构造方法,但是可以使用默认的构造方法进行实例化,如果不想使用Mixin类进行实例化那么可以用mixin关键字来定义Mixin类
抽象类: 实际上就是一个接口,只需要在类声明前添加abstract关键字,方法不需要。方法只需要签名,不需要实现。
abstract class TeacherInterface{
void teaching();
}
class Teacher implement TeacherInterface{
void teaching(
print(""));
}
泛型
dart全面支持泛型。假设你想在你定义的类中,想持有任意类型的数据。如下是怎样使用泛型定义这样的类。
DataHolder<String> dataHolder = new DataHolder('Some data');
print(dataHolder.getData());
dataHolder.setData('New Data');
print(dataHolder.getData());
dataHolder.setData(123);
print(dataHolder.getData());
class DataHolder<T> {
T data;
DataHolder(this.data);
getData() {
return data;
}
setData(data) {
this.data = data;
}
}
3.异步编程
异步编程(上) 异步编程(下)
知识点
1、Dart是什么? 和Flutter是什么关系?
Dart是Google开发的一种面向对象的计算机编程语言,和Java类似
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台
Dart是flutter的程序开发语言
- main()和runApp()函数在flutter的作用分别是什么?有什么关系吗?
main函数是类似于java语言的程序运行入口函数
runApp函数是渲染根widget树的函数
一般情况下runApp函数会在main函数里执行
- 什么是widget? 在flutter里有几种类型的widget?分别有什么区别?能分别说一下生命周期吗?
Widget在flutter里基本是一些UI组件,和
在 Flutter 中,有两类常用的 Widget:
无状态的 StatelessWidget
有状态的 StatefulWidget
初始化 (插入渲染树🌲)
状态改变 (在渲染树中存在)
销毁 (从渲染树中移除)
initState
didChangeDependencies
didUpdateWidget
deactivate
dispose
- 在flutter里streams是什么?有几种streams?有什么场景用到它?
异步数据队列
两种,单订阅流和广播流
网络状态监控
- future 和steam有什么不一样?
在 Flutter 中有两种处理异步操作的方式 Future 和 Stream,Future 用于处理单个异步操作,Stream 用来处理连续的异步操作.
- 什么是flutter里的key? 有什么用?
key是Widgets,Elements和SemanticsNodes的标识符。
key有LocalKey 和 GlobalKey两种。
LocalKey 如果要修改集合中的控件的顺序或数量。GlobalKey允许 Widget 在应用中的任何位置更改父级而不会丢失 State。
- 怎么理解Isolate?
isolate是Dart对actor并发模式的实现。 isolate是有自己的内存和单线程控制的运行实体。isolate本身的意思是“隔离”,因为isolate之间的内存在逻辑上是隔离的。isolate中的代码是按顺序执行的,任何Dart程序的并发都是运行多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不用担心死锁的问题
|