Flutter — Как получить список идентификаторов из Firestore и отобразить их элементы в GridView?

#arrays #dart #flutter #google-cloud-firestore

#массивы #dart #flutter #google-облако-firestore

Вопрос:

Я разрабатываю книжное приложение, и мне нужно отобразить список избранного от каждого пользователя, я могу сохранить все избранное в array в firestore, но я не знаю, как получить их в свою сетку.Я использовал StreamBuilder для извлечения всех книг, но теперь я не знаю, нужно ли мне сохранять их для показа и как. Я попытался извлечь все идентификаторы избранного в список строк, а затем загрузить их в мой GridView, но список равен нулю.

Вот как мой Firestore:

Книги Firestore
Пользователи 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.

Я создал новую коллекцию под названием «книги» с документом в качестве «идентификаторов пользователей» и вложенной коллекцией с книгами и их информацией.

Теперь я могу легко извлекать любимые книги.