Bootstrap

flutter+dart配置

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

  1. Numbers(数值)
    (1)int--------------整数
    (2)double--------双精度数(表示64位(双精度)浮点数)
  2. String(字符串)
    ''' '''可定义多行变量
  3. Boolean(布尔)
  4. 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); // 输出:[咖喱, 糖醋鱼, 印尼九层塔]
  5. Set(集合)
    没有顺序,不能重复的集合
  6. 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
  7. Runes(符文)(不常用)
  8. 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为空则将值赋给变量1,反之则不赋值
    int num = 10; num??=6; print(num); // 输出10
  2. ??运算符
    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
  3. ~/运算符(取整)
    var salary = 12.5 ~/ 12; print(salary); // 输出1
5、Number和String类型转换
  1. Number 转换为 String
    int num = 1234; var str = num.toString(); print(str is String); // 输出: true
  2. String 转换为 int
    String strNum = '1234'; int numStr = int.parse(strNum); print(numStr is int);// 输出: true
  3. 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、类和对象

类名首字母大写

  1. 定义一个类
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
*/
  1. 构造函数
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
我是命名构造函数
*/
  1. 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
*/
  1. 类中 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
*/
  1. class中的静态方法、静态变量

通过在变量或方法名前添加 static 实现
调用时直接 类名.方法名/类名.属性名
静态方法不能调用非静态属性

  1. 对象操作符
  1. ? 条件运算符
    值1 ?. 值2------>当值1为空时输出值2,否则为值1
  2. is 类型判断
    String str = '哈哈'; print(str is String); // 输出true
  3. as 类型转换
    var
  4. ·· 级联操作(连缀)
    ·· 运算符只有最后一行结尾处添加 ;
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();
}
  1. 类的继承

子类使用extends关键字来继承父类

class Son extends Father {
  Son(String name, int age):super(name, age){
    ......
  }
}
11、flutter下载依赖
  1. pubspec.yaml文件中添加要下载的依赖
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  google_fonts: ^3.0.1 
  1. 在编辑器终端输入flutter packages get命令即可

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;