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?
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,
);
}
},
),
],
)
);
}
}
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP