前言
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---------------------------
報錯還沒改完,之後應該還有新的問題,會繼續記錄