#arrays #dart #flutter #google-cloud-firestore
#массивы #dart #flutter #google-облако-firestore
Вопрос:
Я разрабатываю книжное приложение, и мне нужно отобразить список избранного от каждого пользователя, я могу сохранить все избранное в array в firestore, но я не знаю, как получить их в свою сетку.Я использовал StreamBuilder для извлечения всех книг, но теперь я не знаю, нужно ли мне сохранять их для показа и как. Я попытался извлечь все идентификаторы избранного в список строк, а затем загрузить их в мой GridView, но список равен нулю.
Вот как мой Firestore:
class _FavoriteScreenState extends State<FavoriteScreen> {
UserModel model = UserModel();
FirebaseUser firebaseUser;
FirebaseAuth _auth = FirebaseAuth.instance;
List<String> favorites;
Future<List<String>> getFavorites() async{
firebaseUser = await _auth.currentUser();
DocumentSnapshot querySnapshot = await Firestore.instance.collection("users")
.document(firebaseUser.uid).get();
if(querySnapshot.exists amp;amp; querySnapshot.data.containsKey("favorites") amp;amp;
querySnapshot.data["favorites"] is List){
return List<String>.from(querySnapshot.data["favorites"]);
}
return [];
}
@override
Widget build(BuildContext context) {
Widget _buildGridItem(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(document)
));
},
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(
body: favorites != null ? Stack(
children: <Widget>[
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 _buildGridItem(context, favorites[index]);
},
)
],
)
:
Center(child: CircularProgressIndicator())
);
}
@override
void initState() async {
// TODO: implement initState
super.initState();
favorites = await getFavorites();
}
}
Ответ №1:
Мне пришлось изменить свой firestore.
Я создал новую коллекцию под названием «книги» с документом в качестве «идентификаторов пользователей» и вложенной коллекцией с книгами и их информацией.
Теперь я могу легко извлекать любимые книги.