如何显示数据库firestore firebase flutter中的所有名称

How to display all the names in database firestorefirebase flutter

在我的应用程序中,我有一个由商店名称和商店图片组成的模型,如下所示:

class StoreModel
{
  String? imageofStore;
  String? storeName;

  StoreModel({ this.imageofStore, this.storeName});

  //data from server
  factory StoreModel.fromMap(map)
  {
    return StoreModel(
      imageofStore: map['imageofStore'],
      storeName: map['storeName'],
    );
  }

//  data to server
  Map<String, dynamic> toMap(){
    return{
      'imageofStore': imageofStore,
      'storeName': storeName,
    };
  }
}

我的商店数据库如下所示:

调用我使用 initstate 和 setState 的商店名称:

 class addStore extends StatefulWidget {
  const addStore({Key? key}) : super(key: key);

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

class _addStoreState extends State<addStore> {
  
  User ? user = FirebaseAuth.instance.currentUser;
  StoreModel storebox = StoreModel();
  
  @override
  void initState()
  {
    super.initState();
    FirebaseFirestore.instance
        .collection("stores")
        .doc("XQjbm665g2a2xAiiydjr")
        .get()
        .then((value){
      this.storebox = StoreModel.fromMap(value.data());
      setState(() {

      });
    });

  }
  
  @override
  Widget build(BuildContext context) {
    return Container(
     child: Text("${storebox.storeName}"),
    );
  }
}

有了这个,我得到了显示 ID XQjbm665g2a2xAiiydjr 的商店的商店名称,但问题是我想获得所有商店的名称。我知道我需要更改 .doc() 但我不确定我要在其中放入什么以开始显示所有名称。有人可以帮忙吗?

通过提供文档 ID,您得到的是一个 DocumentSnapshot which is the data of a particular Document, but when you remove it, you get QuerySnapshot,它是所有文档数据的列表。因此,要阅读全部内容,请将代码更改为:

List<StoreModel> storesList = [];

FirebaseFirestore.instance
    .collection("stores")
    .get()
    .then((value){
  //Now, this value is of type QuerySnapshot unlike earlier.
  if (value != null && value.docs.isNotEmpty) {
  //If it comes here means the collection is not empty.

  //Because this value is a list of DocumentSnapshot, We've to map it to extract documents.
  //After mapping, returning it as a list and assigning it to storesList
  storesList = value.docs.map((doc) => StoreModel.fromMap(doc.data())).toList();
  setState(() {

  });
  } else {
  //If it comes here means there are no documents in your collection.
  //Notify User there's no data.
  }
});

此代码将获取您 collection 拥有的所有文档,但是,您可以分别使用 limitwhere 进行限制或过滤,只需将 .limit(int).where().get().

之前

对于模型,请尝试转换为 json 或者您可以使用任何一种方式,这只是例如模型

import 'dart:convert';

List<StoreModel> storeModelFromJson(String str) => List<StoreModel>.from(json.decode(str).map((x) => StoreModel.fromJson(x)));

String storeModelToJson(List<StoreModel> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class StoreModel {
    StoreModel({
        this.imageofStore,
        this.storeName,
    });

    final String? imageofStore;
    final String? storeName;

    factory StoreModel.fromJson(Map<String, dynamic> json) => StoreModel(
        imageofStore: json["imageofStore"] == null ? null : json["imageofStore"]!,
        storeName: json["storeName"] == null ? null : json["storeName"]!,
    );

    Map<String, dynamic> toJson() => {
        "imageofStore": imageofStore == null ? null : imageofStore!,
        "storeName": storeName == null ? null : storeName!,
    };
}

试试这个获取所有列表

static Future<List<StoreModel>> getStorelist() async {
  List<dynamic> list = [];
  await FirebaseFirestore.instance
            .collection("stores")
            .get()
            .then((value){
          for(var x in value.docs){
            final Map<String,dynamic> toMap = x.data() as Map<String,dynamic>;
          /// Try to print all data first to see if fetching use log to view on terminal
          log(toMap.toString());

       
            list.add(toMap); 
        }
    });
   
    return list.map((e)= > StoreModel.fromJson(e)).toList();  
}

在我的情况下只获取 1 个数据

static getSingleName(String? uid) async {
    final result =
        await FirebaseFirestore.instance
            .collection("stores").doc(uid).get();
    final response = result.data() as Map<String, dynamic>;
    return response['storeName'].toString();
  }