我正在從Flutter 1.22.6遷移到2.5.0(dart 2.14),并有一個關于顯式鑄造的問題。
在我的代碼中,有一個回傳基類物件的插件API:
Future<BaseData> getReport(String type) async {
return BaseData.fromJson(json.decode(report))
BaseData.fromJson可以建立一些不同的子物件,比如說:
static BaseData fromJson(Map< String, dynamic> json) {
switch (json['type'] as String) {
case 'typeOne':
return ChildDataOne.fromJson(json)。
case 'typeTwo':
return ChildDataTwo.fromJson(json)。
等等
然后我這樣呼叫插件函式:
ChildDataOne childDataTypeOne = await dataManager.getReport(String type)
而在Flutter 1.22.6中,這個作業很正常。由于BaseData.fromJson建構式總是構建正確的子型別,因此不需要顯式鑄造,所以會回傳一個ChildDataOne物件。
然而,在Flutter 2.5.0中,我得到:
一個'BaseData'型別的值不能被分配到'ChildDataOne型別的變數。
我當然可以這樣投遞它:
final childDataTypeOne = await dataManager.getReport() as ChildDataOne;
但是我不清楚為什么在Flutter 2.5.0中需要這樣做,而在1.22.6中卻不需要,或者我是不是做錯了什么。
歡迎所有評論。
uj5u.com熱心網友回復:
產生差異的不是Flutter或Dart版本,而是pubspec.yaml檔案中的最低Dart版本。
在最低Dart版本為2.11.0的情況下,你的代碼可以運行,在Dart 2.14.0的情況下也可以。
environment:
sdk: ">=2.11.0 < 3.0.0"
一旦你改成最小版本2.12.0,你的代碼就無法編譯了。
environment:
sdk: ">=2.12.0 <3.0.0"
如果你使用最小的版本2.12.0,"默認情況下不可歸零 "就會自動激活。
你得到的錯誤是使用templateInvalidAssignmentError。這個錯誤是由type_inferrer.dart中的ensureAssignable方法引發的。在該方法中,有多個isNonNullableByDefault屬性的使用。其中一個會使你的代碼失效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/326629.html
標籤:
