flutter开发必学的编程语言
变量&常量
var和变量类型不能同时存在
var name = "alice"; // 变量,自动推断为String类型
final int age = 18; //不可变变量
const double PI = 3.1415926; // 编绎时常量
late String address; //延迟初始化,稍后赋值。赋值前不可用,否则报错崩溃
String name = "asd"; //省略var
可空变量
int? age = 10; //可空变量
int? age2; //默认值为null
age = null; //可以赋予null
列表:List
List<int> list = []; //List<int>
var list1 = <int>[]; //List<int>
var list2 = []; //List<dynamic>
// print(list); // [1, 2, 3]
// print(list.length); //3
// list.isEmpty; //长度为0时返回true
// list.first; //第一个元素
// list.last; //最后一个元素
集合:Set
所有成员不可重复
Set<int> list1 = {1,2,3,4};
var list2 = <int> {1,2,3,4};
映射/字典:Map
Map<String, int> map1 = {'age': 20, "a": 10};
var map2 = <String, int> {'age': 20, "a": 10};
Iterator:迭代器
list map set等都有迭代器
Map<String, int> map1 = {'age': 20, "a": 10};
var iterator = map1.entries;
for (var value in iterator) {
}
//声明可迭代的变量
Iterable<int> i1 = [1,2,3];
Iterable<MapEntry<String, int>> i2 = [
MapEntry('age', 10)
];
Future:async/await
Future类似js中的Promise
Future<String> future1() async {
await Future.delayed(Duration(seconds: 3));
return "1213";
}
void main() async {
var res = await future1(); //类型是String,不用await是Future<String>
print(res);
}
Stream
逐步、异步的生成多个值。async*搭配yield
Stream<int> getCount(int max) async* {
for (var i = max; i >= 0; i--) {
await Future.delayed(Duration(seconds: 2)); //async*中可以使用await
yield i;
}
}
void main() async {
var a = await getCount(5).toList();
print(a); // 等待约10秒后打印:[5, 4, 3, 2, 1, 0],toList时会等待所有值生成完成,类型:List<int>
getCount(5).listen((value) {
print(value); //依次打印5 4 3 2 1 0
});
await for (var value in getCount(5)) {
print(value); //依次打印5 4 3 2 1 0
}
}
函数的多种写法
//顶级函数 Top-Level
int parseFloat() {
// ....
return 123;
}
// 单一表达式时使用箭头函数
int square(int x) => x * x;
class Person {
int p = 0;
void test() {}
void test2() => p * 2;
}
void main() async {
var list = <int>[1, 2, 3];
var list2 =
list.map((item) {
return item * 2;
}).toList(); //匿名函数,一般用于传递给高阶函数作为参数;或组件(widget)的事件回调
print(list2);
}
操作符&运算符
默认值
int? a;
var b = a ?? 0; //a为null时提供默认值
print(b);
级联
var a =
<int>[1, 2, 3]
..add(4)
..add(5);
print(a); //[1,2,3,4,5]
三元
var a = 1;
a > 0 ? '大于0' : '不大于0';
语言特性
extension
为已存在的类添加方法或属性
extension CustomStringMethod on String {
String get prefixFive {
return length >= 5 ? substring(0, 5) : '长度不足5位';
}
int parseInt() => int.parse(this);
}
void main() async {
String b = "123";
print(b.prefixFive); // '长度不足5位'
print(b.parseInt()); // 123
}