TransWikia.com

Flutter - Como passar lista de IDs do Firestore para um FutureBuilder?

Stack Overflow em Português Asked by djalmafreestyler on December 30, 2021

Estou desenvolvendo um app de livros e preciso de auxílio em carregar a lista de livros favoritos do usuário.

Não sei o a forma que estou fazendo seria a mais correta, estou salvando os IDs de todos os livros que o usuário favorita numa lista no firestore, depois recupero essa lista dentro da lista favoritesId dentro do método getFavoritesId(), e agora é onde ocorre o problema, dentro do método _makeFavoriteList(), como recuperar os somente os dados dos livros que possuem os ids dentro desta lista e mostrá-los no GridView?

coleção livros

coleção usuários

class FavoriteScreen extends StatefulWidget {

  @override
  _FavoriteScreenState createState() => _FavoriteScreenState();
}

class _FavoriteScreenState extends State<FavoriteScreen> {

  CollectionReference booksRef = Firestore.instance.collection("books");
  Future<QuerySnapshot> futureBooks;
  UserModel model = UserModel();
  FirebaseUser firebaseUser;
  FirebaseAuth _auth = FirebaseAuth.instance;
  List<String> favoritesId = [];


  @override
  void initState() {
    getFavoritesId();
    super.initState();
  }

  void getFavoritesId() async{

    List<String> favoritesId = [];

  firebaseUser = await _auth.currentUser();

  DocumentSnapshot querySnapshot = await Firestore.instance.collection("users")
      .document(firebaseUser.uid).get();

  if(querySnapshot.exists && querySnapshot.data.containsKey("favorites") &&
    querySnapshot.data["favorites"] is List && querySnapshot.data["favorites"].length != null){

    for(int i= 0; i < querySnapshot.data["favorites"].length; i++){
      favoritesId.add(querySnapshot.data["favorites"][i]);

    }
    print(favoritesId);

  }

  }

  Future<dynamic> _makeFavoriteList() async{

    Future.delayed(Duration(seconds: 1));

    for(int i =0; i < favoritesId.length; i++){

     futureBooks = booksRef.where("id", isEqualTo: favoritesId[i]).getDocuments();

    }

    print(futureBooks);

    return futureBooks;

  }


  @override
  Widget build(BuildContext context) {

    timeDilation = 2.5;

    Widget _buildFavoriteGridItem(context, index){

      return Column(
        children: <Widget>[
          Material(
            elevation: 7.0,
            shadowColor: Colors.blueAccent.shade700,
            child: InkWell(
              onTap: (){
                Navigator.of(context).push(MaterialPageRoute(
                    builder: (context) => DetailScreen()
                ));
              },
              child: Hero(
                tag: index['title'],
                child: Image.network(
                  index["cover"],
                  fit: BoxFit.fill,
                  height: 132,
                  width: 100,
                ),
              ),
            ),
          ),
          Container(
            width: 100,
            margin: EdgeInsets.only(top: 10, bottom: 5),
            child: Text(index["title"],
              textAlign: TextAlign.center,
              overflow: TextOverflow.ellipsis,
              maxLines: 2,
              style: TextStyle(
                fontSize: 10,
                fontWeight: FontWeight.w900,

              ),
            ),
          ),
        ],
      );
    }

    return Scaffold(
      drawer: CustomDrawer(),
      appBar: AppBar(
        title: Text("Favoritos"),
        centerTitle: true,
        elevation: 0,
        /*actions: <Widget>[
          IconButton(
              icon: Icon(Icons.search),
              onPressed: () async {

                showSearch(context: context, delegate: DataSearch());

              }
          )
        ],*/
      ),

      body: Stack(
        children: <Widget>[
          FutureBuilder(
            future: _makeFavoriteList,
            builder: (context, snapshot){
              if(snapshot.hasData){
                return GridView.builder(
                  padding: EdgeInsets.fromLTRB(16, 16, 16, 16),
                  primary: false,
                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 3,
                    childAspectRatio: MediaQuery.of(context).size.width /
                        (MediaQuery.of(context).size.height),
                    //crossAxisSpacing: 3,
                    //mainAxisSpacing: 3
                  ),
                  itemBuilder: (context, index){
                    return _buildFavoriteGridItem(context, snapshot[index]);
                  },
                );

              } else {
                return Container(
                  color: Colors.red,
                );
              }
            },

          ),

        ],
      )


    );

  }

}

2 Answers

Uma complicação que existe ao usar o firestore é realizar os JOINS da vida... A maneira que você fez é uma saída para o problema, só é necessário você realizar algumas pequenas modificações.

Como você já possuí os IDs de todos os livros favoritos, não é necessário realizar um where para trazer os documents com os dados dos livros, basta você acessá-los diretamente por seu ID.

Future<dynamic> _makeFavoriteList() async{
  Future.delayed(Duration(seconds: 1));

  List<DocumentSnapshot> books = [];

  for(int i =0; i < favoritesId.length; i++){
    book = await booksRef.document(favoritesId[i]).get();
    books.add(book);
  }

  return books;
}

Answered by Matheus Ribeiro on December 30, 2021

Acredito que uma forma de fazer seria:

Para isso você deveria mudar a declaração do futureBook para uma lista vazia. List()

Future<dynamic> _makeFavoriteList() async{

    Future.delayed(Duration(seconds: 1));

    for(int i =0; i < favoritesId.length; i++){

        List<DocumentSnapshot> futureBooks = List();

        futureBooks.add(await booksRef.document(id).get());

    }

    print(futureBooks.toList().toString());

    return futureBooks;

}

O loop irá repetir adicionando à lista somente os livros favoritos. Não consigo testar isso então comente qualquer coisa, ao que tudo indica deve funcionar.

Answered by NelsonThiago on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP