筛选列表时设置 Flutter 全局变量值
Flutter Global Variable value gets set when list is filtered
不确定如何表达这个问题,但目前正在努力解决以下问题。我有一个这样的全局变量:
class GlobalVariables{
static List<Activity> globalActivities = [];
}
我最初在主屏幕中填写列表 class。这行得通。我有第二个屏幕,我在其中使用变量来初始化我的项目列表。在这里,用户可以过滤此 activity 列表,并根据过滤器从本地列表中动态删除项目。不知何故,我的全局变量现在模仿了我不理解的这个本地列表的条目数。也许现在还为时过早,但不确定发生了什么。
@override
Widget build(BuildContext context) {
activities = globals.GlobalVariables.globalActivities;
print("act list start: ${globals.GlobalVariables.globalActivities.length}");
// final activities = Provider.of<List<Activity>>(context) ?? [];
// MyUser user = Provider.of<MyUser>(context);
if(widget.typefilter == "Tunnel"){
print("act list mid 0: ${globals.GlobalVariables.globalActivities.length}");
activities.removeWhere((i){
if (i.type == 'Other'){
return true;
}else{
return false;
}
});
print("act list mid 0b: ${globals.GlobalVariables.globalActivities.length}");
}else if (widget.typefilter == "Other"){
activities.removeWhere((i){
if (i.type == 'Tunnel'){
return true;
}else{
return false;
}
});
}else{
//nothing
}
print("act list mid 1: ${globals.GlobalVariables.globalActivities.length}");
printlog 记录如下:
flutter: act list start: 1978
flutter: act list mid 0: 1978
flutter: act list mid 0b: 0
flutter: act list mid 1: 0
flutter: act list end 0: 0
活动列表应该为 0 是正确的,但为什么我的全局列表现在也为 0?
谢谢,
蒂莫
当您使用 activities = globals.GlobalVariables.globalActivities;
初始化 activities
时,您并不是在创建新的 List
,而是在创建对现有 List< Activity>
.[=20 的额外引用=]
如果您不希望对 activities
的更改反映在 globalActivities
上,您需要制作一个副本,例如 List.of():
List<Activity> activities = List.of(globals.GlobalVariables.globalActivities);
请注意,这将是一个浅层克隆。您不会在里面获得 Activity 的深层副本,但它会再次成为参考。这意味着如果您要更改一个列表中的 Activity
对象中的某些内容,则另一个列表中的相同 Activity
对象将具有相同的更改。这似乎适合您的用例。
不确定如何表达这个问题,但目前正在努力解决以下问题。我有一个这样的全局变量:
class GlobalVariables{
static List<Activity> globalActivities = [];
}
我最初在主屏幕中填写列表 class。这行得通。我有第二个屏幕,我在其中使用变量来初始化我的项目列表。在这里,用户可以过滤此 activity 列表,并根据过滤器从本地列表中动态删除项目。不知何故,我的全局变量现在模仿了我不理解的这个本地列表的条目数。也许现在还为时过早,但不确定发生了什么。
@override
Widget build(BuildContext context) {
activities = globals.GlobalVariables.globalActivities;
print("act list start: ${globals.GlobalVariables.globalActivities.length}");
// final activities = Provider.of<List<Activity>>(context) ?? [];
// MyUser user = Provider.of<MyUser>(context);
if(widget.typefilter == "Tunnel"){
print("act list mid 0: ${globals.GlobalVariables.globalActivities.length}");
activities.removeWhere((i){
if (i.type == 'Other'){
return true;
}else{
return false;
}
});
print("act list mid 0b: ${globals.GlobalVariables.globalActivities.length}");
}else if (widget.typefilter == "Other"){
activities.removeWhere((i){
if (i.type == 'Tunnel'){
return true;
}else{
return false;
}
});
}else{
//nothing
}
print("act list mid 1: ${globals.GlobalVariables.globalActivities.length}");
printlog 记录如下:
flutter: act list start: 1978
flutter: act list mid 0: 1978
flutter: act list mid 0b: 0
flutter: act list mid 1: 0
flutter: act list end 0: 0
活动列表应该为 0 是正确的,但为什么我的全局列表现在也为 0?
谢谢, 蒂莫
当您使用 activities = globals.GlobalVariables.globalActivities;
初始化 activities
时,您并不是在创建新的 List
,而是在创建对现有 List< Activity>
.[=20 的额外引用=]
如果您不希望对 activities
的更改反映在 globalActivities
上,您需要制作一个副本,例如 List.of():
List<Activity> activities = List.of(globals.GlobalVariables.globalActivities);
请注意,这将是一个浅层克隆。您不会在里面获得 Activity 的深层副本,但它会再次成为参考。这意味着如果您要更改一个列表中的 Activity
对象中的某些内容,则另一个列表中的相同 Activity
对象将具有相同的更改。这似乎适合您的用例。