前言
flutter2.0版本帶來了很多變化,特別是加入了空安全,升級後的大片報錯,讓大家望而卻步。
現在距2.0發佈已經快半年了,大部分插件也支持了空安全,而我們的項目卻因爲版本低,用不上新東西,所以準備試一試來升級啦~
升級flutter
老版本1.22.6 ---升級爲---> 最新版本2.2.3
問題很多,慢慢改吧~
一、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、類型對不上
TBC---------------------------
報錯還沒改完,之後應該還有新的問題,會繼續記錄🍔