Flutter中使用List作为Map键进行查找时匹配失败的问题求助
Flutter中使用List作为Map键进行查找时匹配失败的问题求助
嗨,刚看到你的问题,这个坑其实很多Dart新手都会踩,原因和Dart里引用类型的相等判断规则有关,咱们来唠清楚~
你目前的代码看起来逻辑没问题,但为什么明明内容一样的List却匹配不上呢?其实是因为Dart中的List是引用类型,默认情况下,==运算符比较的是两个对象的内存引用(也就是是不是同一个对象),而不是它们的内容。你在Map里定义的['foo', 'bar']和后面声明的List<String> key = ['foo', 'bar'];是两个完全独立的List实例,哪怕内容一模一样,它们的引用也不一样,所以Map找不到对应的key,自然返回null了。
下面给你两个实用的解决办法:
方法一:把List转为字符串作为Key(最简单直接)
如果你的List元素里不会用到分隔符(比如逗号),可以直接把List拼接成字符串当key,这样内容相同的List转出来的字符串完全一致,Map就能正确匹配:
void main() { // 将List用逗号拼接成字符串作为Map的key Map<String, String> lookup = { ['foo', 'bar'].join(','): 'foobar', ['baz', 'qux'].join(','): 'bazqux', ['hello', 'world'].join(','): 'helloworld', }; List<String> key = ['foo', 'bar']; // 查找时也把目标List转成相同格式的字符串 String? result = lookup[key.join(',')]; if (result != null) { print('Result: $result'); } else { print('No match found for $key'); } }
运行这段代码就能得到你想要的Result: foobar啦。
方法二:自定义类并重写相等判断(适合复杂场景)
如果你的List元素可能包含分隔符,或者需要更严谨的内容匹配,可以自定义一个类,重写==和hashCode方法,让它根据List内容来判断相等:
// 先导入collection包,用来比较List内容 import 'package:collection/collection.dart'; class ListKey { final List<String> values; ListKey(this.values); // 重写==运算符,比较两个ListKey的values内容是否一致 @override bool operator ==(Object other) => identical(this, other) || other is ListKey && runtimeType == other.runtimeType && ListEquality().equals(values, other.values); // 重写hashCode,根据values内容生成哈希值 @override int get hashCode => ListEquality().hash(values); } void main() { Map<ListKey, String> lookup = { ListKey(['foo', 'bar']): 'foobar', ListKey(['baz', 'qux']): 'bazqux', ListKey(['hello', 'world']): 'helloworld', }; ListKey key = ListKey(['foo', 'bar']); String? result = lookup[key]; if (result != null) { print('Result: $result'); } else { print('No match found for ${key.values}'); } }
注意哦,这个方法需要你在pubspec.yaml里添加collection依赖:
dependencies: collection: ^1.17.0
总的来说,核心就是让Map的Key能够基于内容判断相等,而不是默认的引用相等,选适合你场景的方法就行啦~
备注:内容来源于stack exchange,提问作者nur najihah
相关产品推荐
相关产品推荐

