dart搭建
1、下载dart的sdk
windows(推荐):
http://www.gekorm.com/dart-windows/
mac:
- 安装brew工具
http://brew.sh/
- brew tap dart-lang/dart
- brew install dart
2、dart开发工具
IDEA、Webstorm、Atom、Vscode等
3、Vscode配置
- 下载 Dart 扩展
- 下载 Code Runner 扩展(用于dart项目运行)
dart语法及使用
Dart命名规范
1、变量名称必须由数字、字母、下划线和美元符($)组成。
2、注意:标识符开头不能是数字
3、标识符不能是保留字和关键字。
4、变量的名字是区分大小写的如: age和Age是不同的变量。在实际的运用中,也建议,不要用一个单词大小写区分两个变量。
5、标识符(变量名称)一定要见名思意 :变量名称建议用名词,方法名称建议用动词
1、dart的数据类型
数组.where(判断条件):返回所有符合条件的值
数组.any(判断条件):若有任意一个符合条件的值则返回true,反之返回false
数组.every(判断条件):所有值均符合条件返回true,反之返回false
- Numbers(数值)
(1)int--------------整数
(2)double--------双精度数(表示64位(双精度)浮点数)- String(字符串)
''' '''可定义多行变量
- Boolean(布尔)
- List(数组)
数组.add(数据):添加数据
数组.reversed.toList():数组倒序
数组.addAll(数组):拼接数组
数组.remove(数据):删除数据
数组.removeAt(数据索引):删除数组中该索引的数据
数组.fillRange(开始索引, 结束索引, 新值):将开始索引与结束索引之间的数据替换为新值
数组.insert(索引, 新值):在索引处插入新值
数组.insertAll(索引, 新数组):在索引处拼接新数组
4.1. 定义 指定类型 的数组:
List strList = <String>['哈哈', '哈哈哈', '哈哈哈哈']; print(strList); // 输出: [哈哈, 哈哈哈, 哈哈哈哈]
4.2. 定义 固定长度 的数组:
List lenList = List<String>.filled(数组长度,填充内容)
4.3. 数组替换
List food = ['咖喱', '肉骨茶', '印尼九层塔']; food.fillRange(1, 2, '糖醋鱼'); print(food); // 输出:[咖喱, 糖醋鱼, 印尼九层塔]
- Set(集合)
没有顺序,不能重复的集合- Map(映射)
6.1. Map.addAll(新值):添加新值
Map person = { "name": "小美"}; person.addAll({ "sex": "女"}); print(person); // 输出:{name: 小美, sex: 女}
6.2. Map.containsKey(键名):判断是否存在该键名
Map person = { "name": "小美"}; print(person.containsKey('name')); // 输出:true
6.3. Map.containsValue(键值):判断是否存在该键值
Map person = { "name": "小美"}; print(person.containsVlaue('小美')); // 输出:true
- Runes(符文)(不常用)
- Symbol(符号)(不常用)
1. String str1 = 'this is dart 1'; print(str1); // 输出 this is dart 1
2. String str2 = 'this is dart 2'; print(str2); // 输出 this is dart 2
3. String str3 = '''
this is dart 1
this is dart 2
this is dart 3
''';
print(str3);
/*
输出:
this is dart 1
this is dart 2
this is dart 3
*/
4. bool a = true; print(a) // 输出true
字符串拼接
String str1 = ‘this is’;
String str2 = ‘dart’;
(1) print(“$str1 $str2”); // 输出:this is dart
(2)print(str1 + str2); // 输出:this is dart
2、dart定义变量------------ dart里有类型校验
var 和 类型 定义变量时不能同时使用
1、使用 var关键字定义
var str = '你好,dart!'
2、直接使用类型定义
String str = 'asdd'
int num = 123
3、dart定义常量---------const、final
区别:
final 可以开始不赋值 只能赋一次 ;
final不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化
const date = new Date().now() // 报错
final date = new Date().now() // 正确
4、运算符
- ??=运算符
变量1 ??= 值
如果变量1为空则将值赋给变量1,反之则不赋值
int num = 10; num??=6; print(num); // 输出10
- ??运算符
var 变量1 = 变量2 ?? 值
如果变量2的值为空,则将值赋给变量1,反之将变量2的值赋给变量1
var age; var actAge = age ?? 18; print(actAge); // 输出18
var age = 15; var actAge = age ?? 18; print(actAge); // 输出15
- ~/运算符(取整)
var salary = 12.5 ~/ 12; print(salary); // 输出1
5、Number和String类型转换
- Number 转换为 String
int num = 1234; var str = num.toString(); print(str is String); // 输出: true
- String 转换为 int
String strNum = '1234'; int numStr = int.parse(strNum); print(numStr is int);// 输出: true
- String 转换为 double(浮点型)
String strDouble = '12.34'; double doubleStr = double.parse(strDouble); print(doubleStr is double); // 输出: true
空字符串转换为数字类型报错问题解决
try {
var numStrs = int.parse(nullStr);
print("数字:${numStrs}");
} catch(err) {
print("空字符串");
}
// 输出: 空字符串
判断变量是否为空—变量.isEmpty
String strValue = '';
print(strValue.isEmpty); // 输出:true
6、自定义方法
6.1. 自定义方法
返回值类型:void、List、String、int等
语法: 返回值类型 方法名() { 方法体 }
void selfFun() { return print("我是自定义方法"); }
6.2. 调用自定义方法:
void main() { var result = selfFun(); print(result); } // 输出:我是自定义方法
6.3. 可选参数:[参数]
// 自定义方法打印用户信息
String printUsrInfo(String name, [var age]) {
return age != null ? "姓名:$name------------年龄:$age" : "姓名:$name------------年龄:未知";
}
print(printUsrInfo("小美")); // 输出:姓名:小美------------年龄:未知
6.4. 默认参数:[默认参数]
// 自定义方法打印用户信息
String printUsrInfo(String name, [String sex = '女', var age]) {
return age != null ? "姓名:$name------性别:$sex------年龄:$age" : "姓名:$name------性别:$sex------年龄:未知";
}
print(printUsrInfo("小美")); // 输出:姓名:小美------性别:女------年龄:未知
print(printUsrInfo("小美", '男')); // 输出:姓名:小美------性别:男------年龄:未知
6.5. 命名参数:{命名参数}
String printUsrInfo(String name, {var sex}) {
return "姓名:$name------------性别:$sex";
}
print(printUsrInfo("小美", sex: '男')); // 输出:姓名:小美------------性别:男
7、自执行方法
((){
print('我是自执行方法');
})()
// 输出:我是自执行方法
8、递归
递归计算阶乘
// 计算阶乘
fn(int n){
sum *= n;
if (n > 2) {
fn(n-1);
} else {
return print("阶乘的结果为:$sum");
}
}
fn(5);
// 输出:阶乘的结果为:120
9、闭包
函数作为参数
// 闭包
closeFn(){
var a = 123; // 不会污染全局、不会被垃圾回收机制回收(常驻内存)
return() {
a++;
print("a的值为:$a");
};
}
var closeSum = closeFn();
closeSum();
// 输出:a的值为:124
10、类和对象
类名首字母大写
- 定义一个类
class Person {
String name = '小美';
int age = 18;
void printInfo(){
print("姓名:$name,年龄:$age");
}
void setInfo(int age) {
this.age = age;
}
}
void main() {
var fn1 = new Person();
print('Person类的name值为:'+fn1.name);
fn1.printInfo();
fn1.setInfo(20);
fn1.printInfo();
}
/* 输出:
Person类的name值为:小美
姓名:小美,年龄:18
姓名:小美,年龄:20
*/
- 构造函数
class Person {
String name = '小明';
int age = 18;
Person (String name, int age) {
this.name = name;
this.age = age;
}
Person.now() {
print('我是命名构造函数');
}
void printInfo() {
print("姓名:$name,年龄:$age");
}
}
void main() {
var fn1 = new Person('小明', 22);
fn1.printInfo()
Person fn2 = new Person.now()
}
/* 输出:
姓名:小明,年龄:22
我是命名构造函数
*/
- class中定义私有属性
使用 _ 加 属性名或方法名定义
设置私有属性或方法的class必须单独抽离成一个文件
// 新建文件夹-->新建dart文件
class PrivateMan {
String _name = '小明';
String sex = '女';
int age = 18;
PrivateMan(String _name, String sex, int age) {
this._name = _name;
this.sex = sex;
this.age = age;
print("$_name--年龄:$age---性别:$sex");
}
_privateFn() {
print('我是私有方法');
}
consName() {
_privateFn();
print("姓名:$_name");
}
}
// 引入dart文件
void main() {
PrivateMan fn3 = new PrivateMan('小美', '女', 22);
fn3.consName();
print(fn3.age);
}
/*
输出:
小美--年龄:22---性别:女
我是私有方法
姓名:小美
22
*/
- 类中 getter、setter 修饰符的用法
get 类似计算属性,用于计算并返回值
set 用于设置class里的值
class Area{
var height;
var width;
Area(this.width, this.height);
get comArea{
return width * height;
}
set changeWidth(value) {
this.width = value;
}
}
void main() {
Area fn = new Area(10, 5);
print(fn.comArea);
fn.changeWidth = 5;
print(fn.comArea);
}
/*输出:
50
25
*/
- class中的静态方法、静态变量
通过在变量或方法名前添加 static 实现
调用时直接 类名.方法名/类名.属性名
静态方法不能调用非静态属性
- 对象操作符
- ? 条件运算符
值1 ?. 值2
------>当值1为空时输出值2,否则为值1- is 类型判断
String str = '哈哈'; print(str is String); // 输出true
- as 类型转换
var
- ·· 级联操作(连缀)
·· 运算符只有最后一行结尾处添加 ;
class Person {
var name;
var age;
Person(var name, var age){
this.name = name;
this.age = age;
}
printInfo() {
print("姓名:$name,年龄: $age");
}
}
void main() {
Person fn = new Person('小美', 20);
fn.printInfo(); // 输出:姓名:小美,年龄: 20
fn.name = '大美'; // 修改name
fn.age = 22; // 修改age
fn.printInfo(); // 重新调用printInfo()---输出:姓名:大美,年龄: 22
}
以上修改name、age及调用printInfo方法可简化为:
void main(){
Person fn = new Person('小美', 20);
fn.printInfo(); // 输出:姓名:小美,年龄: 20
fn..name = '大美'
..age = 22
..printInfo();
}
- 类的继承
子类使用extends关键字来继承父类
class Son extends Father {
Son(String name, int age):super(name, age){
......
}
}
11、flutter下载依赖
- 在pubspec.yaml文件中添加要下载的依赖
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
google_fonts: ^3.0.1
- 在编辑器终端输入
flutter packages get
命令即可