前言

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---------------------------

報錯還沒改完,之後應該還有新的問題,會繼續記錄