flutter 如何在Firestore中将自动生成的id转换为uid?

iyfjxgzm  于 2023-04-07  发布在  Flutter
关注(0)|答案(1)|浏览(136)
User? user = FirebaseAuth.instance.currentUser;

 onPressed: () {
                final games = Games(
                    id: user!.uid,
                    pc: pcController.text.trim(),
                    board: boardController.text.trim(),
                    real: realController.text.trim());
                createGame(games);

            },

    Future createGame(Games games) async {
    final json = games.toJson();
    await docUser.set(json);
  }

下面是我的代码,用户在几个文本字段中输入数据,并将它们保存在Firestore的一个名为“games”的文件中。

class Games {
  String id;
  final String pc;
  final String board;
  final String real;

  Games(
      {required this.pc,
      required this.board,
      required this.real,
      this.id = ''});

  Map<String, dynamic> toJson() => {
        'pc': pc,
        'id': id,
        'board': board,
        'real': real,
      };

  static Games fromJson(Map<String, dynamic> json) => Games(
        pc: json['pc'],
        board: json['board'],
        real: json['real'],
        id: json['id'],
      );
}

我创建的游戏类

List<String> docGameIDs = [];
  User? user = FirebaseAuth.instance.currentUser;

     getGamesId() async {
    await FirebaseFirestore.instance
        .collection('games')
        .where('id', isEqualTo: user?.uid)
        .get()
        .then((snapshot) {
      docGameIDs = [];
      for (var element in snapshot.docs) {
        docGameIDs.add(element.reference.id);
      }
    });
  }
 FutureBuilder(
                        future: getGamesId(),
                        builder: (context, snapshot) {
                          return ListView.builder(
                            itemCount: docGameIDs.length,
                            itemBuilder: (context, index) {
                              return Container(
                                child:
                                    GetGames(documentId: docGameIDs[index]),
                              );
                            },
                          );
                        },
                      ),

最后,我从Firestore获取数据的代码。

class GetGames extends StatelessWidget {
  final String documentId;
  const GetGames({super.key, required this.documentId});

  @override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('games');
    return FutureBuilder<DocumentSnapshot>(
      future: users.doc(documentId).get(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return Center(
            child: Text(
              '${data['pc']}',
            ),
          );
        }
        return const Text('');
      },
    );
  }
}

GetGames小程序

如图所示,我在Games类中定义的文件中创建的id值与文件自动分配的id不相同。然而,我在第一段代码中使用了id = user!.uid的定义,因此这些id是相同的。这样,在文件中创建的id将不再与文件的id相同,而是用户的UID。
但是要让第三个代码中的.where('id', isEqualTo: user?.uid)代码工作,id和uid必须与图像中看到的相同。简而言之,我如何将自动分配的短id打印为文件中定义的uid(XyyjAZ7FZ8PtWw0vfL7YWXIJAGg2)?

kcwpcxri

kcwpcxri1#

如果你需要一个自己选择的文档ID,而不是随机生成的ID(t7iq...DNzU),那么你必须创建一个包含该ID的引用。所以在代码中,它将是:

CollectionReference gamesRef = FirebaseFirestore.instance.collection('games');
gamesRef.document(user!.uid).set(yourObject);
//                      👆

相关问题