length property Null safety
Returns the number of elements in the iterable.
This is an efficient operation that doesn't require iterating through the elements.
Implementation
@override
int get length => (_tail - _head) & (_table.length - 1);
override
Setting the length changes the number of elements in the list.
The list must be growable.
If newLength is greater than current length,
new entries are initialized to null,
so newLength must not be greater than the current length
if the element type E is non-nullable.
final maybeNumbers = <int?>[1, null, 3];
maybeNumbers.length = 5;
print(maybeNumbers); // [1, null, 3, null, null]
maybeNumbers.length = 2;
print(maybeNumbers); // [1, null]
final numbers = <int>[1, 2, 3];
numbers.length = 1;
print(numbers); // [1]
numbers.length = 5; // Throws, cannot add `null`s.
Implementation
@override
set length(int value) {
if (value < 0) throw RangeError('Length $value may not be negative.');
if (value > length && null is! E) {
throw UnsupportedError(
'The length can only be increased when the element type is '
'nullable, but the current element type is `$E`.');
}
var delta = value - length;
if (delta >= 0) {
if (_table.length <= value) {
_preGrow(value);
}
_tail = (_tail + delta) & (_table.length - 1);
return;
}
var newTail = _tail + delta; // [delta] is negative.
if (newTail >= 0) {
_table.fillRange(newTail, _tail, null);
} else {
newTail += _table.length;
_table.fillRange(0, _tail, null);
_table.fillRange(newTail, _table.length, null);
}
_tail = newTail;
}