Dart List Filter 的方法


#Flutter#Dart#List

其他語言通常都是有叫做 filter() 之類的 function,但在 Dart 想過濾 List 中的某些值時是使用 where(),滿特別的命名。
where() 回傳的是 Iterable 型別,所以必須再呼叫 toList() 轉回 List 型別。

void main() {
  List<int> list = [87, 8787];

  print(list.where((e) => e > 100).toList()); // [8787]
  print(list.where((e) => e < 100).toList()); // [87]
}

試一試吧:https://dartpad.dev/?id=8281264511bc4db31bbdc5c4379c042d


Dart 的 List Call By Value 方法


#Flutter#Dart#List

最近把 List 存到 BLoC 發現在 A 頁面取出後對這 List 操作後,B 頁面也會跟著被改變,是因為 Dart 物件預設是 call by reference。

void main() {
  List<int> aList = [8787];
  List<int> bList = aList;
  
  print('aList: $aList');// aList: [8787]
  print('bList: $bList');// bList: [8787]
  
  bList.add(87);
  
  print('aList: $aList');// aList: [8787, 87]
  print('bList: $bList');// bList: [8787, 87]
}

解決方法


只要在給值的時候使用加上 toList() 即可

void main() {
  List<int> aList = [8787];
- List<int> bList = aList;
+ List<int> bList = aList.toList();
  
  print('aList: $aList');// aList: [8787]
  print('bList: $bList');// bList: [8787]
  
  bList.add(87);
  
  print('aList: $aList');// aList: [8787]
  print('bList: $bList');// bList: [8787, 87]
} 

試一試吧:https://dartpad.dev/?id=26d30bcd783277c83d00041279de673e