Flutter-如何从Firestore检索ID列表并在GridView中显示其项目?

时间:2019-03-31 18:25:09

标签: arrays dart flutter google-cloud-firestore

我正在开发一个书本应用程序,我需要显示每个用户的收藏夹列表,我可以将所有收藏夹保存在Firestore中的数组中,但是我不知道如何将它们收藏到我的网格中。我使用StreamBuilder来检索所有书籍,但现在我不知道是否需要存储它们以显示它们以及如何显示。我试图将所有收藏夹ID检索到字符串列表,然后将它们加载到GridView中,但列表为空。

这是我的Firestore的方式:

Books Firestore Users 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 && querySnapshot.data.containsKey("favorites") &&
    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 个答案:

答案 0 :(得分:0)

我不得不更换我的壁炉。

我创建了一个名为“ books”的新集合,其文档为“ userIDs”,并创建了包含书籍及其信息的子集合。

现在我可以轻松检索喜欢的书了。