筛选列表时设置 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 对象将具有相同的更改。这似乎适合您的用例。