Flutter全局列表变量在本地列表过滤时被意外修改问题排查
问题分析与解决方案
嗨Timo,这个问题其实是Dart中列表的引用类型特性导致的,我来帮你拆解清楚:
核心原因
Dart里的List属于引用类型,当你执行activities = globals.GlobalVariables.globalActivities;这行代码时,并没有创建一个新的列表副本——而是让本地变量activities直接指向了全局列表globalActivities所在的内存地址。也就是说,这两个变量其实是同一个列表的“别名”,你对activities做任何修改(比如removeWhere),本质上都是在修改全局的globalActivities列表,这就导致了两者长度始终保持一致。
解决方法
你只需要在赋值时创建全局列表的副本,这样本地的activities就是一个独立的列表,修改它不会影响全局变量。有几种常用的创建副本的方式:
方式1:使用List.from()
把赋值代码改成:
activities = List.from(globals.GlobalVariables.globalActivities);
方式2:使用toList()方法
这也是创建副本的常用写法:
activities = globals.GlobalVariables.globalActivities.toList();
方式3:展开运算符(语法糖)
如果你喜欢更简洁的写法,也可以用展开运算符:
activities = [...globals.GlobalVariables.globalActivities];
修改后效果
修改之后,你再执行removeWhere操作时,只会修改本地的activities列表,全局的globalActivities会保持初始的1978条数据,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

