前言
flutter2.0版本带来了很多变化,特别是加入了空安全,升级后的大片报错,让大家望而却步。
现在距2.0发布已经快半年了,大部分插件也支持了空安全,而我们的项目却因为版本低,用不上新东西,所以准备试一试来升级啦~
升级flutter
老版本1.22.6 ---升级为---> 最新版本2.2.3(已经从2.2.3升级到2.5.1了,没有什么大问题)
问题很多,慢慢改吧~
一、API调整
首先修改 Dart SDK 的 environment
,在pubspec.yaml
environment: sdk: ">=2.12.0-0 <3.0.0"
1、废弃List
需要使用 [] 或者 List.filled
来替换你原有的实现,例如:new LIst()改为[] ; List<Widget>(length) 改为 List.filled(length)。
2、废弃Stack的overflow
需要使用 clipBehavior 替换 overflow
,例如:overflow: Overflow.visible 改为 clipBehavior: Clip.none,默认是 Clip.hardEdge。
3、FlatButton 改为 TextButton;RaisedButton 改为 ElevatedButton
FlatButton 和 RaisedButton 上的 padding、color 等方法现在需要使用 ButtonStyle 来设置。
4、其他
-
- Scaffold 的 resizeToAvoidBottomPadding 改为 resizeToAvoidBottomInset
- 官方新增了 DateUtils 到 'package:flutter/material.dart' 里,可能会与你的项目里的 DateUtils 命名冲突。
- Theme.of(context, shadowThemeOnly: true) 的 shadowThemeOnly 参数正式取消。
- Localizations.localeOf(context, nullOk: true) 和 MediaQuery.of(context, nullOk: true) 的 nullOk 参数正式取消。
二、空安全
参考 https://dart.cn/null-safety
1、什么是空安全
空安全是指代码中的类型默认是非空的,除非你声明它们可空,否则它们的值都不能为空。
类型系统中的可空性:
空安全推出前,Null
类型被看作是所有类型的子类;而空安全修改了类型的层级结构,Null
类型不再是所有类型的子类。如下图:
Null
是任何可空类型的子类,例如,可空类型String?,作为基础类型的超类,可以接收String和null。
2、四个关于空安全的操作符
① ?
类型后面跟操作符 ? ,表示当前变量可为null。例如:
int count = null; ❌(报错) int? count = null; ✅(正确)
常用于组件中不必传的参数变量:
②!
类型后面跟操作符 ! ,表示此变量值不为null,如果为null则会抛出异常。慎重使用。例如:
String? name = null; name.length ❌(报错) name?.length ✅(正确) name!.length ❌(报错)操作符!表示当前变量不为null,但是name为null,会抛出异常。
常用于可以确定不为null的变量。
③late
表示这是一个非空变量,稍后再初始化。例如:
④required
表示此参数不能为空。
原来的@required 可以直接改为required,以前没有使用 @required
注解的参数加上 required
时要慎重。
注:@required和required的区别:@required
将参数标记为必须传递,如果未传,分析器会给出一个提示;空安全中,required
修饰的参数未传递,会显示一个错误。
更多修改意见可以查看https://dart.cn/null-safety/faq
三、其他调整
1、void function
报错 error: The argument type ‘Function‘ can‘t be assigned to the parameter type ‘void Function()‘.
声明改为 final void Function() onTap;
2、类型对不上
3、关于RenderBox

四、启动后常见报错
1、type 'Null' is not a subtype of type 'XXX'
2、LateInitializationError: Field 'XXX' has not been initialized
3、BoxConstraints forces an infinite height(已解决)
TBC---------------------------
报错还没改完,之后应该还有新的问题,会继续记录🍔
9/29更新 启动后报错
END----------------------------------