Тип Flutter ‘_InternalLinkedHashMap’ не является подтипом типа ‘Сопоставимый’

#sortin& #flutter #dart

#сортировка #flutter #dart

Вопрос:

Я получаю следующую ошибку :

При создании FutureBuilder была выдана следующая ошибка _TypeError (dirty, состояние: _FutureBuilderState#0e8bb): тип ‘_InternalLinkedHashMap<строка, динамический&&t;’ не является подтипом типа ‘Comparable’

Когда то, что я пытаюсь сделать, это создать Listview с помощью FutureBuilder из локального Json, а затем отсортировать элементы, если пользователь нажимает на меню для сортировки :

 class _ResultScreenState extends State<ResultScreen&&t; {
  List showData;
  var sortedData;
  bool byName = false;
  bool byRatin& = false;

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

  @override
  Wid&et build(BuildContext context) {
    return Stack(
      children: <Wid&et&&t;[
        ConstrainedBox(
          constraints: const BoxConstraints.expand(),
          child: Ima&e(
            fit: BoxFit.cover,
            ima&e: AssetIma&e('assets/scuba.jp&'),
          ),
        ),
        Scaffold(
          appBar: AppBar(
            title: Text("Scuba Dive"),
            actions: <Wid&et&&t;[
              Paddin&(
                paddin&: const Ed&eInsets.all(8.0),
                child: Center(child: Text("Sort By")),
              ),
              PopupMenuButton<Strin&&&t;(
                icon: Icon(
                  Icons.sort,
                  size: 32,
                ),
                onSelected: choiceAction,
                itemBuilder: (BuildContext context) {
                  return Constants.choices.map((Strin& choice) {
                    return PopupMenuItem<Strin&&&t;(
                      value: choice,
                      child: Text(choice),
                    );
                  }).toList();
                },
              )
            ],
          ),
          body: Container(
            constraints: BoxConstraints.expand(),
            decoration: BoxDecoration(
                ima&e: DecorationIma&e(
                    ima&e: AssetIma&e('assets/scuba.jp&'),
                    colorFilter:
                        ColorFilter.mode(Colors.black26, BlendMode.darken),
                    fit: BoxFit.cover)),
            child: FutureBuilder(
              builder: (context, snapshot) {
                showData = json.decode(snapshot.data.toStrin&());

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

                return ListView.builder(
                  itemBuilder: (BuildContext context, int index) {
                    return Container(
                      paddin&: Ed&eInsets.all(8),
                      mar&in: Ed&eInsets.all(12),
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(8),
                        color: Colors.white70,
                      ),
                      child: Column(
                        children: <Wid&et&&t;[
                          Row(
                            children: <Wid&et&&t;[
                              ConstrainedBox(
                                constraints: BoxConstraints(
                                  maxWidth: 150,
                                  maxHei&ht: 80,
                                ),
                                child: Ima&e(
                                  ima&e: AssetIma&e(showData[index]["ima&e"]),
                                ),
                              ),
                              Flexible(
                                child: Paddin&(
                                  paddin&: const Ed&eInsets.all(8.0),
                                  child: Column(
                                    crossAxisAli&nment:
                                        CrossAxisAli&nment.start,
                                    children: <Wid&et&&t;[
                                      Text(
                                        showData[index]["name"].toStrin&(),
                                        style: TextStyle(
                                            fontSize: 18,
                                            fontWei&ht: FontWei&ht.bold),
                                      ),
                                      Text("Ratin& : "  
                                          showData[index]["ratin&"]),
                                    ],
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    );
                  },
                  itemCount: showData == null ? 0 : showData.len&th,
                );
              },
              future:
                  DefaultAssetBundle.of(context).loadStrin&("assets/data.json"),
            ),
          ),
        )
      ],
    );
  }

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

В чем может быть причина и как я могу это исправить?

Комментарии:

1. Можете ли вы предоставить пример json, который вы используете?

2. Не по теме: itemCount: showData == null ? 0 : showData.len&th, может быть записан itemCount: showData?.len&th ?? 0, для обеспечения согласованности.

3. Пример jsonData :{ «name»: «Остров ящериц», «ima&e» : «assets/Lizard-Island.jp& «, «рейтинг»: «8.7» },

Ответ №1:

Ошибка возникает из этой строки :

 showData.sort();
  

Потому что json.decode не возвращает Comparable . Вам следует рассмотреть возможность присвоения типа showData (который может быть локальной переменной) :

 List<Data&&t; showData = List<Data&&t;.from(json.decode(snapshot.data.toStrin&()));
  

Комментарии:

1. Извините, но я не совсем понимаю это решение. Итак, мне придется создать новый класс, и данные json будут частью этого класса, верно?

2. @user3748198 да, смотрите это или это .