Flutter
Dart 环境搭建
使用 vscode 开发 flutter 项目需要装Flutter和Dart插件(另外再加一个 code runner 插件,方便运行);
下载 Dart SDK,配置环境变量;
官网下载地址:https://dart.dev/get-dart/archive
;
去终端查看一下版本验证是否配置环境变量成功:dart --version
;
运行案例
dart 有个入口函数,main函数
并且一行代码结尾要用分号结束
main() {
print("hello");
}
输出要是有乱码重启 vscode 即可
声明变量
- 明确声明
- 类型推导
- 动态类型
明确类型
dart 是一门强类型的语言
void main(List<String> args) {
String foo = 'test';
int num = 1;
}
类型推导
- var
- const
- final
- dynamic
var、const、final
const 和 final 声明的变量不可以重新赋值
void main(List<String> args) {
var foo = 'test';
const foo1 = 'test';
final foo2 = 'test';
}
const 和 final 区别
const 必须直接赋值常量,final 可以通过运行时赋值
void main(List<String> args) {
const foo1 = test();// 报错
final foo2 = test();// 可以
}
int test() {
return 10;
}
dynamic
明确类型和类型推导中var、const、final声明的类型都是不可以改变的,而dynamic就可以;
开发中尽量少用 dynamic 类型,存在类型潜在危险
void main(List<String> args) {
dynamic foo = 'test';
foo = 123;
}
类型
- 数字类型 int、double
- 布尔类型 bool
- 字符串 String
- 集合类型 List、Set、Map
bool 类型注意
dart 中没有 非 0 即真 的说法
void main(List<String> args) {
var foo = 'test';
// 错误的写法
if(foo) {
print(foo);
}
// 这样写
if(foo != null) {
print(foo);
}
}
字符串 String
- 单双引号
- 三引号,可以换行
void main(List<String> args) {
var foo = 'test';
var foo1 = "test";
var foo2 = '''
abc
cba
'''
}
拼接
一般是**$**这样,当$直接跟一个变量时是可以省略的;
要是跟表达式就不可以省略;
void main(List<String> args) {
final name = 'zsf';
final age = 18;
print("name:$name age:$age");
print("${name.runtimeType}");
}
集合类型
- List,类似数组
- Set,元素唯一且无序
- Map,键值对
void main(List<String> args) {
List<String> names = ['zsf', 'kebe', 'zsf'];
// Set一般应用于Lsit的去重
Set<int> nums = {101, 111};
List<String> name1 = List.from(Set.from(names));
print(name1); // [zsf, kobe]
Map<String, dynamic> info = {
'name': 'zsf',
'age': 18,
};
}
dynamic 和 object 区别
dart 中所有的类都默认继承Object;
使用 dynamic 类型可以进行类型转化,而使用 Object 类型则不行;
函数
dart 中函数的定义是这样的
int sum(int num1, int num2) {
return num1 + num2;
}
参数
dart 中函数的参数有两种:必传参数和可选参数
必传参数
void main(List<String> args) {
sum(1, 2);
}
int sum(int num1, int num2) {
return num1 + num2;
}
可选参数
- 位置可选参数
- 命名可选参数
隐式可选参数
void main(List<String> args) {
printInfo(1);
printInfo(1, 2);
}
void printInfo(int num1, [int? num2, String? str]) {
print('$num1 $num2 $str');
}
命名可选参数
传可选参数时需要指名参数名字
void main(List<String> args) {
printInfo(1);
printInfo(1, num2: 2);
}
void printInfo(int num1, {int? num2, String? str}) {
print('$num1 $num2 $str');
}
默认值
默认值只能给可选参数,不可以给必传参数
void main(List<String> args) {
printInfo(1);
printInfo(1, num2: 2);
}
void printInfo(int num1, {int? num2, String? str = 'hhh'}) {
print('$num1 $num2 $str');
}
匿名函数
只有一行才能使用箭头函数
void main(List<String> args) {
List<String> names = ['zsf', 'hhh', 'kkk'];
names.forEach((item) {
print(item);
});
names.forEach((item) => print(item));
}
返回值
如果没有返回值,默认返回 null
运算符
大部分运算符与其它语言类似,下面只说不同的
整除
const num = 7;
print(num ~/ 3); // 2
??=赋值
- 如果有值,使用原来的值;
- 如果值为 null,则赋值;
var name = 'zsf';
name ??= 'hhh';
print(name); // zsf
??
var msg = null;
var res = msg ?? 'hello';
print(res); // hello
如果msg有值则赋值给res,没有则使用后面的'hello';