颤振全局变量值在列表被过滤时被设置



不知道如何表达这个问题,但我正在努力解决以下问题。我有一个这样的全局变量:

class GlobalVariables{ 
static List<Activity> globalActivities = [];
}

我首先在我的主屏幕类中填充列表。这个作品。在第二个屏幕中,我使用变量来初始化项目列表。在这里,用户可以过滤这个活动列表,并根据过滤器动态地从本地列表中删除项目。不知何故,我的全局变量模仿了这个我不理解的本地列表的条目数。也许现在还为时过早,但我不确定发生了什么。

@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 ?

谢谢,timo

当您用activities = globals.GlobalVariables.globalActivities;初始化activities时,您不是在创建一个新的List,而是在创建一个对现有List< Activity>的额外引用。

如果你不希望activities的变化反映在globalActivities上,你需要做一个副本,例如List.of():

List<Activity> activities = List.of(globals.GlobalVariables.globalActivities);

注意,这将是一个浅克隆。您将不会在内部拥有活动的深层副本,但它将再次成为引用。这意味着如果您要更改一个列表中的Activity对象中的某些内容,则另一个列表中的相同Activity对象将具有相同的更改。这看起来很适合您的用例

最新更新