length property Null safety

int length

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);
void length=(int value)
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;
}