当List.map
函数没有用一个值去接收它的返回值时,这个函数甚至不会执行。
个人推测是被编译器把代码优化掉了,断点甚至不会执行map这段代码。这种写法本身就是很奇怪的(同事的骚操作),仅记录问题本身
dart
void test() {
int i = 0;
List<int> list = [1, 1, 1];
list.map((e)=> i++);
print(i);//这里还是0
}
在Future中返回Future.error()
在某些情况下因为dart类型推导错误,导致不会中断流,后续的then()
函数会被错误的执行
推荐尽量指明泛型类型,做好类型约束。
- Flutter: 3.22.0
- Dart: 3.4.0
- OS: macOS 15.6.1 (Apple M1 Pro)
scss
void main() {
test2().then((value) {
int i = value["value"];
print(i);
}).catchError((e) {
print(e);
});
}
///正确的实例,返回Future.error后,then函数不会被执行。
Future test1() {
return Future<int>((){
return 1;
}).then((value){
if(value == 0) {
return Future.value(value);//使用Future进行包裹,使用[async]关键字,或者使用then(int),都可以保证返回Future.error后,then函数不会被执行。
} else {
return Future.error("error");
}
}).then((value){//这里还未编译时,已经被推断为dynamic类型,所以不用强转
int i = value;
return i;
});
}
///类型推导错误的实例
Future test2() {
return Future<int>((){
return 1;
}).then((value){
if(value == 0) {
return value; //这里直接返回value,而不是使用Future进行包装
} else {
return Future.error("error");
}
}).then((value){//这里还未编译,就被推断为Object,必须强转
//当上面返回Future.error时,这里不会被跳过,而是会执行。所以会出现类型错误:
//type 'Future<dynamic>' is not a subtype of type 'int' in type cast
int i = value as int;
return i;
});
}