我正在嘗試https://pub.dev/packages/freezed的 Freezed 頁面中給出的示例。這是我正在測驗將 int 替換為 List<int> 添加 [40] 作為默認值的示例。
@Freezed(makeCollectionsUnmodifiable: false)
class Example with _$Example {
factory Example([@Default([40]) List<int> list]) = _Example;
factory Example.fromJson(Map<String, dynamic> json) => _$ExampleFromJson(json);
}
使用示例類:
final e = Example(); //default parameter [40]
//e.list.add(42); //error producing line
print('e $e');
final f = Example([40]); //parameter same as default value
f.list.add(42);
print('f $f');
final g = Example([41]); //another parameter
g.list.add(42);
print('g $g');
輸出是:
e Example(list: [40])
f Example(list: [40, 42])
g Example(list: [41, 42])
如果我洗掉默認引數案例中的注釋,我會收到以下錯誤:
Unhandled exception:
Unsupported operation: Cannot add to an unmodifiable list
#0 UnmodifiableListMixin.add (dart:_internal/list.dart:114:5)
#1 main (file:///D:/Dart/darttest/bin/darttest.dart:27:10)
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
為什么串列變得不可修改?
uj5u.com熱心網友回復:
Dart 注釋由決議源代碼的代碼生成器使用。由于注解中的運算式不會被執行,它們必須是可以在編譯期間計算的常量運算式。
使用關鍵字構造的物件const必須是不可變的。它們不能改變,正如Dart Language Tour中所寫:
您不能更改 const 變數的值:
baz = [42]; // Error: Constant variables can't be assigned a value.
雖然最終物件無法修改,但其欄位可以更改。相比之下,const 物件及其欄位不能更改:它們是不可變的。
var constantList = const [1, 2, 3]; // constantList[1] = 1; // This line will cause an error.
要在注釋中提供默認串列值,它必須是const不可修改的。
關于凍結的說明
另一方面,修改串列違背了整個凍結的概念。Freezed 用于生成不可變的資料結構,可以使用該copyWith方法進行更新。修改 Freezed 類中的任何集合都是錯誤的。
最近的更新確實通過annotation添加了可變性unfreezed,它應該用于可變類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497914.html
上一篇:顫振:從firebase云存盤中檢索檔案夾名稱時,未初始化lateinitializationerror欄位“listResult”
