Flutter — фильтрация вкладок из списка

#firebase #flutter #google-cloud-firestore

#firebase #flutter #google-облако-firestore

Вопрос:

У меня есть такие вкладки, как все, бар, супермаркет, ресторан … и т.д. Что я хотел сделать, так это то, что всякий раз, когда я нажимаю «Все», он должен показывать все данные из firestore, но всякий раз, когда я нажимаю на другие вкладки, он должен соответствующим образом фильтровать listview…

Вот код для вкладок

 import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class Categories extends StatefulWidget {
  @override
  _CategoriesState createState() => _CategoriesState();
}

class _CategoriesState extends State<Categories> {
  List<String> companyTypes = [];

  int selectedIndex = 0;
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(left: 20),
      child: StreamBuilder<QuerySnapshot>(
        stream: FirebaseFirestore.instance
            .collection('Company-Categories')
            .orderBy('comptype')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            Text('Loading');
          } else {
            companyTypes = ['All'];
            for (int i = 0; i < snapshot.data.docs.length; i  ) {
              DocumentSnapshot snap = snapshot.data.docs[i];
              companyTypes.add(snap.data()['comptype']);
            }
            return Padding(
              padding: EdgeInsets.symmetric(vertical: 20),
              child: SizedBox(
                height: 35, // 35
                child: ListView.builder(
                  scrollDirection: Axis.horizontal,
                  itemCount: companyTypes.length,
                  itemBuilder: (context, index) => buildCategoriItem(index),
                ),
              ),
            );
          }
          return Container(width: 0.0, height: 0.0);
        },
      ),
    );
  }

  Widget buildCategoriItem(int index) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selectedIndex = index;
        });
      },
      child: Container(
        alignment: Alignment.center,
        margin: EdgeInsets.only(left: 0),
        padding: EdgeInsets.symmetric(
          horizontal: 20, //20
          vertical: 5, //5
        ),
        decoration: BoxDecoration(
            color:
                selectedIndex == index ? Color(0xFFEFF3EE) : Colors.transparent,
            borderRadius: BorderRadius.circular(
              16, // 16
            )),
        child: Text(
          companyTypes[index],
          style: TextStyle(
            fontWeight: FontWeight.bold,
            color:
                selectedIndex == index ? Color(0xFF84AB5C) : Color(0xFFC2C2B5),
          ),
        ),
      ),
    );
  }
}
  

Вот код для Listview

 import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:url_launcher/url_launcher.dart';

class ContactCard extends StatefulWidget {
  @override
  _ContactCardState createState() => _ContactCardState();
}

class _ContactCardState extends State<ContactCard> {
  ScrollController _scrollController = new ScrollController();
  List<String> companyTypes = [];
  // By default first one is selected

  @override
  Widget build(BuildContext context) {
    void customLaunch(command) async {
      if (await canLaunch(command)) {
        await launch(command);
      } else {
        print(' could not launch $command');
      }
    }

    return StreamBuilder(
      stream: FirebaseFirestore.instance
          .collection('Phonebook')
          .orderBy('name')
          .snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }

        return ListView(
          scrollDirection: Axis.vertical,
          controller: _scrollController,
          shrinkWrap: true,
          children: snapshot.data.docs.map((document) {
            return Padding(
              padding: const EdgeInsets.only(left: 15, right: 15),
              child: Card(
                child: ListTile(
                  leading: CircleAvatar(
                    radius: 20,
                    child: ClipOval(
                      child: SizedBox(
                        height: 100,
                        width: 100,
                        child: Image.network(
                          document['logo'],
                          fit: BoxFit.fill,
                        ),
                      ),
                    ),
                  ),
                  title: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Flexible(
                        child: Text(
                          document['name'],
                          style: TextStyle(fontSize: 14),
                        ),
                      ),
                      CircleAvatar(
                        backgroundColor: Colors.white12,
                        child: IconButton(
                          icon: Icon(
                            Icons.call,
                          ),
                          onPressed: () {
                            var callNum = document['primaryPhone'];
                            customLaunch("tel:$callNum"); //;
                          },
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            );
          }).toList(),
        );
      },
    );
  }
}
  

И, наконец, вот домашняя страница

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:phonebook_admin/Screens/Add/addButtonsPage.dart';

import 'contact_card.dart';
import 'widgets/categories.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(
            Icons.add,
            color: Colors.white,
            size: 30,
          ),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AddButtonsPage()),
            );
          },
        ),
        title: Center(
          child: Text('Phonebook'),
        ),
        actions: <Widget>[
          IconButton(
            icon: Icon(
              Icons.search,
              color: Colors.white,
              size: 30,
            ),
            onPressed: () {
              // do something
            },
          ),
        ],
      ),
      body: SingleChildScrollView(
        child: Container(
          child: Column(
            children: <Widget>[
              Categories(),
              ContactCard(),
            ],
          ),
        ),
      ),
    );
  }
}
  

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

1. В этом случае вы захотите использовать запрос на выбранной вкладке для вашего построителя потоков FirebaseFirestore.instance .collection('Phonebook') .orderBy('name') .snapshots() . См. firebase.google.com/docs/firestore/query-data/queries

2. Спасибо за ответ @FrankvanPuffelen. Я уже пробовал это, но это не сработало. Не могли бы вы показать мне пример?

3. Если вы пытались выполнить запрос, и это не сработало, пожалуйста, отредактируйте свой вопрос, чтобы отобразить этот запрос.