Dart+Flutter开发跨平台应用学习笔记
Window开发环境搭建
开发flutter的话无需单独安装dartSDK,这里建议跳过
首先安装chocolatey工具
chocolatey是windows下的一个命令行的包管理工具,类似ubuntu的apt,或centos下的yum
在powershell中运行
$ iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
然后安装dart 的sdk
然后使用命令行安装
$ choco install dart-sdk
在vscode中安装dart扩展和Code Runner扩展 之后可以直接新建XXX.dart文件进行编辑
运行需要右键run code
测试运行
在vscode新建XX.dart文件,写入下面代码,保存后右键run code运行即可
main() {
print('Hello dart');
}
运行结果
[Running] dart "d:\QiTFi\开发文件夹\Dart\tempCodeRunnerFile.dart"
Hello dart
[Done] exited with code=0 in 0.228 seconds
以上,Windows Dart开发环境构建完成
Dart 入口方法 Dart打印,注释,变量,常量,命名规则
入口方法
Dart所有要被执行的代码都要放在入口方法里面,就是上文里的main方法
mian方法定义有两种方式,第一种是上文的写法,另一种是`
void main(){}
表示这个方法没有返回值
注释
和JavaScript类似
使用双或三斜杠或者斜杠加*来注释代码块
Dart变量
-
dart是一个强大的脚本类语言,可以不预先定义变量类型,自动会类型推导
-
dart中定义变量可以通过var关键字 也可以通过类型来申明变量
-
Dart里有类型校验
-
List item
var srt = 'this is var';
String str = 'this is var';
print(srt + ' ' + str);
dart中的数据类型:
- Number:int double
- Strings: String
- Booleans:bool
- List(数组):在Dart中,数字是列表对象,所以大多数人只是称他们为列表
- Maps(字典):通常来说,Map 是一个键值对相关的对象。键和值可以是任何类型的对象。每个键值对应一个值
还有些不常用的,这里不记录
String类型
string类型在使用时可以使用单引号,双引号和三引号(单双引号都可),使用三引号的好处是可以多行进行赋值
字符串的拼接:
String str1 = 'Hello';
String str2 = 'Dart';
print('$str1 $str2');
print(str1 + str2);
两种方式都可以进行字符串的拼接
数字
double既可以是整形,也可以是浮点型
数组(列表)
//两张定义方式
var l1 = ['zxcv', 'qwer', 'asdf'];
var l2 = new List();
l2.add('qwer');
l2.add('asdf');
l2.add('zxcv');
print(l1);
print(l2);
var l3 = new List<String>();
//这样可以指定数组类型
常用属性:
List myList = ['香蕉', '苹果', '西瓜'];
print(myList.length); //得到列表长度
print(myList.isEmpty); //判断列表是否为空,为空则true
print(myList.isNotEmpty); //不为空则true
print(myList.reversed); //对列表倒序排序,
var newMyList = myList.reversed.toList();
print(newMyList);
List常见方法:
List myList = ['香蕉', '苹果', '西瓜'];
myList.add('桃子'); //增加一个
myList.addAll(['葡萄', 'sdfa']); //拼接数组
print(myList.indexOf('苹果')); //查找,返回索引值,找不到返回-1
myList.remove('西瓜'); //按具体值删除
myList.removeAt(0); //按索引值删除
myList.fillRange(1, 2, 'aaaa'); //指定修改,第一个参数起始值,第二个参数结束值
myList.insert(1, 'ssss'); //指定位置插入
myList.insert(1, ['www', 'eee']); //插入多个
var str = myList.join(','); //转成以','分隔的字符串
var str1 = '香蕉-苹果-西瓜';
var list1 = str.split('-'); //以'-'为分割字符串转化为列表
var s = new Set(); //不能添加重复数据
Maps
第一种定义 Maps 的方式
var person = {
"name": "张三",
"age": 20,
"work": ["程序员", "送外卖"]
};
print(person);
print(person["name"]);
第二种方式
var p = new Map();
p["name"] = "李四";
p["age"] = 18;
p["work"] = ["程序员", "送外卖"];
常用属性
Map person = {'name': '张三', 'age': 20};
print(person.keys); //获取字典的key,转换成字列表需要使用toList方法,即person.keys.toList()
print(person.values.toList()); //同上,这个获取value
print(person.isEmpty); //判断是否为空
print(person.isNotEmpty);
person.addAll({'work': "敲代码", 'height': 180}); //map只有addAll
person.remove('name'); //根据key删除
print(person.containsKey('name')); //查找key返回布尔值
print(person.containsValue('张三'));//查找value,返回布尔值
Dart判断数据类型
使用 is 判断数据类型
var str = "1234";
if (str is String) {
print("String");
} else if (str is int) {
print('int');
} else {
print('其他');
}
Dart转换数据类型
数字和字符串的互换
String price = '123';
var myNum = double.parse(price);//也可以是int
var myNum = 12;
var str = myNum.toString();
其他类型转换成Booleans类型
//isEmpty:判断字符串是否为空
var str = 'XXX';
if(str.isEmpty){
print('str空');
}else{
print('str不为空');
}
Dart变量命名规则
和其他语言基本相似
Dart的命名规则:
- 变量名称必须由字母、数字、下划线、和美元符($)组成
- 注意:标识符开头不能是数字
- 标识符不能是保留字和关键字。
- 变量的名字是区分大小写的如: age和Age是不同的变量。在实际的运用中,也建议,不要用一个
- 标识符(变量名称)一定要见名思意:变量名称建议用名词,方法名称建议用动词
Dart 常量:final 和 const修饰符
const PI = 3.1415926;
final PI_2 = 3.1415926;
print(PI);
print(PI_2);
final 和 const 的区别:
final可以开始不赋值,它是运行时的常量,而且final是惰性初始化,即在运行时第一次使用前才初始化
Dart运算符:
// + - * / % ~/ 加 减 乘 除 取余 取整
// == != < > <= >= 关系运算符
// ! && || 取反 并且 或者
// = ??= 基础赋值运算符
b??=23:表示如果b为空的话,把23赋值给b
条件判断语句
写法好像和Java一样
if else switch case
?:
??
循环语句
与其他语言大同小异,这里仅记录比较特殊的用法(昨天记笔记忘了保存,笔记丢了,离谱)
函数,箭头函数,匿名函数,闭包
使用函数作为参数和匿名函数(匿名函数即没有名字的函数)
fn1() {
print('fn1');
}
fn2(fn) {
fn();
}
fn2(fn1);
//匿名方法
var fn = () {
print('我是一个匿名方法');
};
fn();
可选参数和命名参数,命名参数调用时需要输入名字
//可选参数,
String printUserInfo(String username, [int age]) {
if (age != null) {
return '$username $age';
}
return '$username';
}
//命名参数
String printUserInfoB(String username, {int age, String sex = '男'}) {
print('$username $age $sex');
}
箭头函数
List list = ['qwer', 'adsf', 'zxcv'];
list.forEach((value) {
print(value);
});
//等同于
list.forEach((value) => print(value));
//
list.forEach((value) => {
print(value)
});
自执行方法
自执行方法可以从下方的括号传入参数,在上面的括号接受
//自执行方法
(() {
print('我是自执行方法');
})();
闭包
fn() {
var a = 123;
return () {
a++;
print(a);
};
}
var b = fn();
b();
Dart中的类 对象
Dart所有的东西都是对象,所有的对象都继承自Object类
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,而且所有的类都是Object的子类
一个类通常由属性和方法组成
class 类名{
属性;
方法();
}
实例化
var p1 = new Person();
Person p1 = new Person();
构造函数
//构造函数
class Person{
Person(name){
}
//默认构造函数的简写
Person(this.name,this.age){
}
}
Dart可以定义命名构造函数
class Person{
Person.now(){
print("我是命名构造函数");
}
}
Dart 封装属性需要在变量名前加下划线
this的用法和其他语言区别不大
类,静态成员 操作符 类的继承
Dart中的静态成员:
1、使用static 关键字来实现类级别的变量和函数
2、静态方法不能访问非静态成员,非静态方法可以访问静态成员
Dart中的类的操作符
?条件运算符 is类型判断 as类型转换 …级联操作
?条件运算符
main(){
Person p;
p?.printInfo();
//这个问号可以判断p对象是否为空,为空的话这个代码将不执行
}
is类型判断
if(p is Person){
p.name = '李四';
}
as类型转换
var p1;
p1 = '';
p1 = new Person();
(p1 as Person).printInfo();
…级联操作(重要)
p1.name = '张三222';
p1.age = 40;
p1.printInfo();
//可以变为
p1..name = '李四'
..age = 40
..printInfo();
类的继承
Dart中的类的继承:
1、子类使用extends关键词来继承父类
2、子类会继承父类里面可见的属性和方法但是不会继承构造函数
3、子类能复写父类的方法 getter和setter
Dart 中的抽象类 多态 以及接口
Dart中抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口.
I
1、抽象类通过abstract关键字来定义
2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法
3、如果子类继承抽象类必须得实现里面的抽象方法
4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
5、抽象类不能被实例化,只有继承它的子类可以
extends抽象类和implements的区别:
|
1、如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类
2、如果只是把抽象类当做标准的话我们就用implements实现抽象类
和Java一样,dart也有接口,但是和Java还是有区别的。
首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口。
Dart可以一个类实现多个接口
Dart中的mixins
mixins的中文意思是混入,就是在类中混入其他功能。
在Dart中可以使用mixins实现类似多继承的功能
因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件
1、作为mixins的类只能继承自0bject,不能继承其他类
2、作为mixins的类不能有构造函数
3、一个类可以mixins多个mixins类
4、mixins绝不是继承,也不是接口,而是一种全新的特性