Flutter(Dart)列表能否存储变量或函数值?用全局const列表还是类更好?
问题1:不创建类,仅用const列表作为全局变量使用是否可行?
- 不可行,原因如下:
- Dart中
const修饰的列表属于编译时常量,不仅列表本身的引用不可修改,列表内的所有元素也必须是编译时常量,不支持后续动态修改值。你的收藏变量需要频繁更新,完全不符合const的使用场景。 - 关于全局变量导致卡顿、耗内存的说法属于片面认知:只要你存储的是常规的页面状态、id这类轻量数据,全局列表的内存占用可以忽略不计,也不会引发卡顿,不需要过度担心。
- 如果你坚持不创建类,完全可以用非const的全局列表实现。
- 如果你后续改用类实现也没有任何问题,反而更推荐:自定义类可以明确字段类型,避免Map写法容易出现的字段名拼写错误、类型不匹配问题,即使收藏变量频繁变化,只需要把类中的收藏字段定义为非final的可变字段即可,没有额外弊端。
- Dart中
问题2:能否将变量存入列表?如果可以的话具体要怎么实现?
- 可以存入,但要注意Dart的传递特性:
- 如果你直接存int、bool、String这类不可变的基本类型值,存入列表的是值的拷贝,后续修改原变量不会同步更新列表内的值,不符合你动态更新收藏状态的需求。
- 可行的实现方案(不需要单独创建自定义类):
- 用
Map包装可变状态:将每个条目的id、数据、收藏状态都存在Map中,列表存储Map的引用,后续修改Map内的字段即可同步更新列表中的对应值,示例:
// 全局列表,存储每个条目的信息 List<Map<String, dynamic>> studyItemList = [ {"id": "0_01_01", "title": "xxx知识点", "isFav": false}, {"id": "0_01_02", "title": "xxx知识点", "isFav": true}, ]; // 修改收藏状态的示例代码,直接修改列表内对应条目的isFav字段即可 void toggleFav(int index) { studyItemList[index]["isFav"] = !studyItemList[index]["isFav"]; }- 如果你需要存储按钮组件函数,也可以把状态和函数关联存储,同样用Map包装即可:
List<Map<String, dynamic>> favBtnList = [ {"id": "0_01_01", "btnWidget": favoriteButton_0_01_01, "isFav": false}, // 其他按钮条目 ]; - 用
内容的提问来源于stack exchange,提问作者eno2
相关产品推荐
相关产品推荐

