我正在使用兩個具有相同值的變數。變數 A 是一個初始變數,變數 B 是我用來應用更改的變數,所以當我想重置變數 BI 時,只需將 A 分配給它,問題是每次我這樣做時,B 的更改然后應用于兩者. 我看過很多地方,這些是我嘗試過的解決方案:
List.toList()
_fields!.clear(); _fields = _initFields!.toList();展開運算子 (...)
_fields!.clear(); _fields = [...?_initFields];
還嘗試了這篇文章中的以下內容:Dart/Flutter – 如何克隆/復制串列
var newNumbers = List.from(numbers);
var newNumbers = List.generate(numbers.length, (index) => numbers[index]);
var newNumbers = List.of(numbers);
var newNumbers = List.unmodifiable(numbers);
這里是完整的代碼:
import 'package:project/utilities/classes/filter_field.dart';
class FilterLogic {
List<FilterField>? _initFields = [];
List<FilterField>? _fields = [];
bool? listComplete = false;
void addField(FilterField? field) {
_fields!.add(field!);
}
void addInitField(FilterField? field) {
_initFields!.add(field!);
}
List<FilterField>? getFields() {
return _fields;
}
void resetFieldsToOriginal() {
_fields!.clear();
_fields = [...?_initFields!];
}
void showFields() {
print('_fields --------------------------------------------------------------------------------------');
_fields!.forEach((element) {
if(element.checked == true) {
print({ element.checked, element.field, element.filteredApplied, element.criteria, element.filteringOperators});
}
});
print('_initFields --------------------------------------------------------------------------------------');
_initFields!.forEach((element) {
if(element.checked == true) {
print({ element.checked, element.field, element.filteredApplied, element.criteria, element.filteringOperators});
}
});
}
}
這是我填充這兩個變數的方法:
filterCol.forEach((column) {
String? filteredApplied;
String? filteredCriteria = 'None';
bool checked = false;
filtersList.forEach((element) {
if (column.field == element.field) {
filteredApplied = element.operator;
filteredCriteria = element.criteria;
checked = true;
}
});
FilterField field = FilterField(
filteredApplied: filteredApplied,
field: column.field,
label: column.label,
filteringOperators: column.filteringOperators,
criteria: filteredCriteria,
checked: checked == true ? true : false,
);
FilterField initField = FilterField(
filteredApplied: filteredApplied,
field: column.field,
label: column.label,
filteringOperators: column.filteringOperators,
criteria: filteredCriteria,
checked: checked == true ? true : false,
);
setState(() {
filterLogic.addField(field);
filterLogic.addInitField(initField);
});
});
在這里我呼叫 reset 方法:
DialogButton(
width: 106.25,
child: Text(
"CANCEL",
style: TextStyle(
color: Colors.white, fontSize: 14, fontFamily: 'Chivo'),
),
onPressed: () => {
Navigator.of(context).pop(),
setState(() {
filterLogic.resetFieldsToOriginal(); // <-------------
})
},
color: Color.fromRGBO(84, 84, 84, 1),
radius: BorderRadius.circular(0.0),
),
uj5u.com熱心網友回復:
僅僅復制串列是不夠的,因為您的新串列參考了相同的FilterField實體。這意味著如果您更改FilterField新串列中的任何內容,舊串列中的更改將相同。因此,在您的情況下,您需要進行所謂的deep克隆。您可以為此創建一個方法:
class FilterField {
// ... other code
FilterField CopyWith() {
return new FilterField(...);
}
}
然后你可以這樣:
var newList = oldList.toList().map((item) => item.CopyWith()).toList();
現在您可以單獨更改串列。
但請注意,如果FilterField有任何其他需要更改的類實體,您也需要創建這些實體的新實體。這就是為什么它被稱為深度克隆。
希望這就是你要找的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314994.html
上一篇:用于創建在GDB中在線作業但在Code::Blocks中不作業的旋轉表的代碼
下一篇:C如何從多個函式回傳陣列?
