【问题标题】:Flutter type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Comparable<dynamic>'Flutter 类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'Comparable<dynamic>' 的子类型
【发布时间】:2020-11-30 00:45:43
【问题描述】:

我收到以下错误:

在构建 FutureBuilder(dirty, state: _FutureBuilderState#0e8bb) 时引发了以下 _TypeError: 类型 '_InternalLinkedHashMap' 不是类型 'Comparable' 的子类型

当我想做的是使用 FutureBuilder 从本地 Json 构建 Listview 时,如果用户点击菜单进行排序,则对项目进行排序:

class _ResultScreenState extends State<ResultScreen> {
  List showData;
  var sortedData;
  bool byName = false;
  bool byRating = false;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        ConstrainedBox(
          constraints: const BoxConstraints.expand(),
          child: Image(
            fit: BoxFit.cover,
            image: AssetImage('assets/scuba.jpg'),
          ),
        ),
        Scaffold(
          appBar: AppBar(
            title: Text("Scuba Dive"),
            actions: <Widget>[
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Center(child: Text("Sort By")),
              ),
              PopupMenuButton<String>(
                icon: Icon(
                  Icons.sort,
                  size: 32,
                ),
                onSelected: choiceAction,
                itemBuilder: (BuildContext context) {
                  return Constants.choices.map((String choice) {
                    return PopupMenuItem<String>(
                      value: choice,
                      child: Text(choice),
                    );
                  }).toList();
                },
              )
            ],
          ),
          body: Container(
            constraints: BoxConstraints.expand(),
            decoration: BoxDecoration(
                image: DecorationImage(
                    image: AssetImage('assets/scuba.jpg'),
                    colorFilter:
                        ColorFilter.mode(Colors.black26, BlendMode.darken),
                    fit: BoxFit.cover)),
            child: FutureBuilder(
              builder: (context, snapshot) {
                showData = json.decode(snapshot.data.toString());

                if (byName) {
                  showData.sort();
                }

                return ListView.builder(
                  itemBuilder: (BuildContext context, int index) {
                    return Container(
                      padding: EdgeInsets.all(8),
                      margin: EdgeInsets.all(12),
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(8),
                        color: Colors.white70,
                      ),
                      child: Column(
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                              ConstrainedBox(
                                constraints: BoxConstraints(
                                  maxWidth: 150,
                                  maxHeight: 80,
                                ),
                                child: Image(
                                  image: AssetImage(showData[index]["image"]),
                                ),
                              ),
                              Flexible(
                                child: Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: <Widget>[
                                      Text(
                                        showData[index]["name"].toString(),
                                        style: TextStyle(
                                            fontSize: 18,
                                            fontWeight: FontWeight.bold),
                                      ),
                                      Text("Rating : " +
                                          showData[index]["rating"]),
                                    ],
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    );
                  },
                  itemCount: showData == null ? 0 : showData.length,
                );
              },
              future:
                  DefaultAssetBundle.of(context).loadString("assets/data.json"),
            ),
          ),
        )
      ],
    );
  }

  void choiceAction(String choice) {
    if (choice == Constants.FirstItem) {
      setState(() {
        byName = true;
      });
    } else if (choice == Constants.SecondItem) {
      print("Second");
    }
  }
}

可能是什么原因,我该如何解决?

【问题讨论】:

  • 你能提供一个你使用的示例json吗?
  • 离题:itemCount: showData == null ? 0 : showData.length, 可以写成itemCount: showData?.length ?? 0, 以保持一致性。
  • jsonData 示例:{ "name" : "Lizard Island", "image" : "assets/Lizard-Island.jpg", "rating" : "8.7" },

标签: sorting flutter dart


【解决方案1】:

错误来自这一行:

showData.sort();

因为json.decode 不返回Comparable。你应该考虑给showData一个类型(可能是一个局部变量):

List<Data> showData = List<Data>.from(json.decode(snapshot.data.toString()));

【讨论】:

  • 抱歉,我不太了解这个解决方案。所以我必须创建一个新类,json 数据将成为该类的一部分,对吧?
  • @user3748198 是的,请参阅 thisthis
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 2020-11-25
  • 2018-12-14
  • 2021-01-22
  • 1970-01-01
  • 2021-06-17
  • 2021-01-30
  • 2019-03-23
相关资源
最近更新 更多