[英]How to set length of list in dart with default value?
在我的應用程序中,我在很多地方都使用過這樣的列表:-
List<int> nums = [];
// initializing list dynamically with some values.
nums.length = 12; // increasing length of list
// setting these values afterward using nums[i] at different places.
現在遷移到空安全后,顯然nums.length = 4
給了我一個運行時錯誤,所以我想知道是否有任何方法可以使用默認值設置列表的長度,這樣,如果列表的長度更小與之前相比,新長度的額外元素添加了一些默認值。
注意:當然我知道我們可以使用 for 循環,但我只是想知道是否有比這更簡單、更清潔的方法。
var num = List<int>.generate(4, (i) => i);
你可以閱讀這個。
您的問題是 Dart 中的List
沒有添加更多空間的概念,而您 promise 在設置之前不會使用此新容量。
但是您可以輕松地制作自己的List
實現,它可以做到這一點:
import 'dart:collection';
void main() {
List<int> nums = ExtendableList();
nums.length = 3;
nums[2] = 1;
nums[0] = 1;
nums[1] = 1;
print(nums); // [1, 1, 1]
nums.add(2);
print(nums); // [1, 1, 1, 2]
print(nums.runtimeType); // ExtendableList<int>
}
class ExtendableList<T> with ListMixin<T> {
final List<T?> _list = [];
@override
int get length => _list.length;
@override
T operator [](int index) => _list[index] as T;
@override
void operator []=(int index, T value) => _list[index] = value;
@override
set length(int newLength) => _list.length = newLength;
}
如您所見,我們在幕后使用了 null 類型,但從外部看,它就像列表包含不可為空一樣工作。 這只有效,因為我們假設當null
值在列表中時不會調用[]
運算符(如果我們擴展列表但未設置值,則會發生這種情況)。
我應該補充一點,使用這樣的List
實現確實會帶來很大的風險,因為如果您錯誤地使用它,您不會從分析器中收到任何警告/錯誤。
另一種方法:
extension ExtendList<T> on List<T> {
void extend(int newLength, T defaultValue) {
assert(newLength >= 0);
final lengthDifference = newLength - this.length;
if (lengthDifference <= 0) {
return;
}
this.addAll(List.filled(lengthDifference, defaultValue));
}
}
void main() {
var list = <int>[];
list.extend(4, 0);
print(list); // [0, 0, 0, 0];
}
或者,如果您必須設置.length
而不是調用單獨的方法,則可以將其與julemand101 的答案的變體結合使用指定的默認值而不是null
:
class ExtendableList<T> with ListMixin<T> {
ExtendableList(this.defaultValue);
final T defaultValue;
final List<T> _list = [];
@override
int get length => _list.length;
@override
T operator [](int index) => _list[index];
@override
void operator []=(int index, T value) {
if (index >= length) {
_list.extend(index + 1, defaultValue);
}
_list[index] = value;
}
@override
set length(int newLength) {
if (newLength > length) {
_list.extend(newLength, defaultValue);
} else {
_list.length = newLength;
}
}
}
(如果指定的索引越界,我還讓其operator []=
自動增長ExtendableList
,類似於 JavaScript。)
您必須使用可空元素列表使其更長。
List<int?> nums = [];
nums.length = 4; // OK
print(nums); // [null, null, null, null]
您也可以使用filled
方法。 這里的growable
默認為false
。
void main() {
var a = List<int>.filled(3, 0, growable: true);
print(a);
// [0, 0, 0]
}
參考:https://api.flutter.dev/flutter/dart-core/List/List.filled.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.