#flutter #dart #filter
Вопрос:
ребята, я пытаюсь создать фильтр, используя идентификаторы товара. Я много исследовал, но мне кажется, что я упускаю что-то очевидное. Итак, как я уже сказал, мне нужно сделать фильтрацию, у меня есть API, в котором две разные модели Транспортируют и топят. Каждый класс содержит идентификатор автобуса, трамвая, метро. Для идентификатора автобуса = 1, для трамвая = 2, для идентификатора автострады = 3, и для каждого из этих отдельных идентификаторов API содержит 3 отдельных списка номеров автобусов, номеров трамваев и номеров поездов метро.
Я создаю две модели и два экрана:
Модели
class TransportType {
TransportType({
this.ttId,
this.ttTitle,
this.ttNote,
});
final int ttId;
final String ttTitle;
String ttNote;
}
Также я также четко указал, что мне нужен идентификатор маршрута в ссылке из API. Теперь это выглядит так:
Для болот это:
Future<List<Marshes>> fetchMarshes() async {
final response = await http.post(
Uri.parse(
'http:/getMarshes.php?fmt=jsonamp;tt_id'),
body: {'tt_id': '1'}, headers: <String, String>{'authorization': basicAuth}, );
Для выборки транспортной модели это выглядит следующим образом:
Future<List<TransportType>> fetchTranspotes() async {
var response = await http.get(
Uri.parse(
'http://getTransportTypes.php?fmt=json'),
headers: <String, String>{'authorization': basicAuth});
var jsonResponse = convert.jsonDecode(response.body) as List;
return jsonResponse
.map((transport) => TransportType.fromJson(transport))
.toList();
}
Для получения обоих списков: Списка типов транспорта и списка номеров я использую FutureBuilder:
Srceen для типов транспорта выглядит так:
body: FutureBuilder<List<TransportType>>(
future: futureTransposrt,
builder: (context, snapshot) {
if(snapshot.hasData){
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (builder, index){
TransportType project = snapshot.data[index];
return ListTile(
title: Text(project.ttId.toString()),
onTap: (){
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context)=>MarshId(ttId: 1,)), (route) => false);
},
В конструкторе MarshId я помещаю нужные мне значения, поэтому второй экран также имеет тот же конструктор, и он выглядит так:
class MarshId extends StatefulWidget {
final int ttId;
const MarshId({Key key, this.ttId}) : super(key: key);
@override
_MarshIdState createState() => _MarshIdState();
}
Так что мои вопросы довольно глупы: что я делаю не так? Я сделал все так, как говорят документы, и я снова перешел сюда, но это не сработало, и я совершенно не понимаю, что я делаю не так. Я также использовал это выражение, как здесь рекомендуется, но теперь, похоже, это не работает: marshes = marshes.where((marsh) => marsh.ttId == ttId).toList()
; Я понимаю эту задачу: мне нужно отфильтровать данные по категориям, и когда пользователь нажимает на определенный тип транспорта, например, «автобус», он попадает на экран, где есть только список номеров автобусов. Но я не могу понять, что именно я делаю неправильно, когда пишу фильтрацию.
Я действительно ценю вашу помощь, ребята!
Ответ №1:
вы можете передать идентификатор на другую страницу, используя конструктор в своем ListBus()
классе, который вы просто используете, где, как этот ie. допустим, имя вашего параметра-TTiD; тогда ваш фильтр будет
marshes = marshes.where((marsh) => marsh.ttId == ttId).toList();