Как фильтровать по идентификатору в Dart? Не искать бар

#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();