簡體   English   中英

如何使用默認值設置 dart 中的列表長度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM