#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 будут частью этого класса, верно?