Flutter) Dialog TextButton的功能自动执行,无需tab按钮

Flutter) Dialog TextButton's function is executed automatically without tab the button

嗨,我是编码新手,Flutter 是我的第一语言。

当用户长按 AlertDialog 中的 'OK' 按钮时,我想从 StreamBuilder 的 ListView 中删除 Firestore 数据(聊天列表)。

(过程总结:

  1. 长按 ListViewBuilder 的一项
  2. 显示检查 AlertDialog
  3. 选项卡'OK'
  4. 确定按钮的功能执行)
但是当我长按该项目时,在我看到对话框之前会自动执行 deleteFunction(确定按钮的功能)。

我怎样才能做到?

真的很难!

这是我的代码

StreamBuilder(
              stream: chatRoomDB,
                builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (snapshot.connectionState == ConnectionState.active &&
                      snapshot.data != null) {
                    return ListView(
                        children: snapshot.data!.docs
                            .map<Widget>((DocumentSnapshot ds) {
                      Map<String, dynamic> data =
                          ds.data()! as Map<String, dynamic>;
                      receiverProfileImageURL = data['ProfileImageURL'];
                      receiverUID = data['UserID'];
                      receiverNickName = data['NickName'];
                      msgContent = data['MsgContent'];
                      chatID = data['ChatID'];
                      
                     return Container(
                        margin: EdgeInsets.all(3),
                        child:  ListTile(
                            shape: Border(
                                bottom:
                                    BorderSide(color: Colors.grey, width: 1)),
                            onTap: () {
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => ChattingRoom(
                                            chatID: data['ChatID'],
                                            receiverUID: data['UserID'],
                                            receiverImageURL:
                                                data['ProfileImageURL'],
                                            receiverNickName: data['NickName'],
                                          )));
                            },
                            onLongPress: () => checkDialog2(
                                context: context,
                                msg: 'Delete?',
                                okButtonString: 'OK',
                                okFunction: chatDBDeleteFunction(
                                    data['UserID'], data['ChatID']),
                                noButtonString: 'No'),
                            leading: Container(
                                child: CircleAvatar(
                              foregroundImage: NetworkImage(
                                '$receiverProfileImageURL',
                              ),
                              backgroundImage:
                                  NetworkImage('$errorImageURL'),
                            )),
                            title: Text('$receiverNickName'),
                        ),
                      );
                    }).toList());
                  }
                  return Container();
                })
checkDialog2({
  required context,
  required String? msg,
  required String? okButtonString,
  required Future<dynamic> okFunction,
  required String? noButtonString,
}) {
  print(1);
  okFunctions(okFunc) {
    print(3);
    okFunction;
    Navigator.pop(context);
    print(4);
  }

  print(5);
  showDialog(
      context: context,
      builder: (context) {
        print(2);
        return AlertDialog(content: Text('$msg'), actions: <Widget>[
          TextButton(
            onPressed: () => okFunctions(okFunction),
            child: Text(
              '$okButtonString',
              textAlign: TextAlign.end,
            ),
          ),
          TextButton(
            onPressed: () {
              Navigator.pop(context);
            },
            child: Text(
              '$noButtonString',
              textAlign: TextAlign.end,
            ),
          ),
        ]);
      });
}
  Future chatDBDeleteFunction(receiverUID, chatID) async {
    await FirebaseFirestore.instance
        .collection('ChatMessage')
        .doc('${FirebaseAuth.instance.currentUser?.uid}')
        .collection(chatID)
        .get()
        .then((QuerySnapshot qs) => {
              qs.docs.forEach((DocumentSnapshot snapshot) {
                snapshot.reference.delete();
              })
            });

日志顺序是, 打印 1->5>2 并自动删除 + showDialog.

那时(列表项已经消失),如果我点击 'OK' 按钮,然后打印 '3' 和错误(因为没有要删除的东西)

(ps。虽然我把okfunction改成了void Function,但是它自动启动了。一样)

感谢您的帮助

我更愿意传递 UserIdChatId 然后调用 chatDBDeleteFunction(receiverUID, chatID) 函数并传递来自 values

的值
 TextButton(
        onPressed: () {
         Class.chatDBDeleteFunction(receiverUID, chatID)


           }
    )

chatDBDeleteFunction(receiverUID, chatID)函数可以是静态的