在Dart或Flutter中将LinkedHashMap<dynamic, dynamic>转换为HashMap<String, List<String>>

6

你好,我是新手学习flutter和dart。我在类型转换maps方面遇到了麻烦。我以HashMap<String,List<String>>的格式存储了一些数据在Firestore中。在我的flutter应用程序中,当我获取这些数据时,它们以LinkedHashMap<dynamic,dynamic>的格式呈现。我想将这个LinkedHashMap转换成一个HashMap<String,List<String>>。请帮忙。

LinkedHashMap<dynamic,dynamic> mapUserWatchlistCompanies= documentSnapshot.data['Watchlist']; // Fetched data.

HashMap<String,List<String>> hashMapUserWatchlist = ???//How can it be converted? Need help here.
3个回答

9
在Dart中,类型转换与Java或Swift略有不同。当涉及到dynamic时,您必须正确地进行类型转换。
在您的情况下,您得到一个LinkedHashMap<dynamic,dynamic>,在JSON情况下,可以安全地假定键始终是一个String值,但是键对应的value可以是多种类型(数字,字符串,布尔值,映射或列表)。
因此,如果您有以下形式的JSON:
{
  "keyOne": ["One", "Two","whatever"],
  "keyTwp": ["roses", "are", "red"],
  "keyThree":["You", "know", "nothing", "john", "nonw"]
}

这是一个 HashMap<String, List<String>>,但是dart最初会得到一个 LinkedHashMap<dynamic, dynamic>,您可以通过以下代码安全地将其转换:

 LinkedHashMap<dynamic, dynamic> theParsedOne = .....
    HashMap<String, List<String>> newMap = HashMap.from(theParsedOne.map((key, value) {
      List<dynamic> values = List.from(value);
      return MapEntry(
          key.toString(),
          values.map((theValue) {
            return theValue.toString();
          }).toList());
    }));

2
我不确定你的代码中具体指的是什么 HashMap,但如果你指的是 Map,你可以使用以下代码创建一个 map:

最初的回答
Map<String, List<String>> values = Map<String, List<String>>.from(snap.data['Watchlist']);

3
我尝试了你的建议。但是出现了异常 - “type 'List<dynamic>' 不是类型 'List<String>' 的子类型”。 - Abhijeet Kharatmol

0
如果您想将任何类型的LinkedHashMap转换为Map:
将其序列化并反序列化回Map即可。
final validMap =
        json.decode(json.encode(internalLinkedHashMap)) as Map<String, dynamic>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接