flutter升級2.0


前言

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

需要轉換為RenderBox,而不是改變類型為RenderObject。因為下面要用到的屬性方法都是基於RenderBox的。

 四、啟動后常見報錯

1、type 'Null' is not a subtype of type 'XXX'

可能原因:用了late,沒有?,所以不能為null
解決辦法:改為可null
注:改為可null后,可能出現大量代碼報錯,可以考慮添加一些空的默認值,例如:{},[]

2、LateInitializationError: Field 'XXX' has not been initialized

可能原因:用了late,但是沒有在初始化時賦值
解決辦法:去掉late,改用?或是在初始化時賦值

3、BoxConstraints forces an infinite height(已解決)

可能原因:新版對ScreenUtil初始化的時候,BoxConstraints需要設置最大寬高,之前沒有設置
解決辦法:在ScreenUtil初始化的時候設置BoxConstraints的最大寬高

TBC---------------------------

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

 

9/29更新 啟動后報錯

END----------------------------------

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM