Flutter + Firebase -如何处理Listen事件

e5nqia27  于 2023-02-20  发布在  Flutter
关注(0)|答案(1)|浏览(128)

我有一个主小部件,其中基于布尔值显示了两个不同的小部件

drawScreen ? DrawScreenWidget() : GuessScreenWidget(),

在GuessScreenWidget()上,我有监听事件

sketchStroke = databaseReference
        .child('ref')
        .onValue
        .listen((data) {
 });

因此,当布尔值改变时,屏幕在两个小部件之间移动,但GuessScreenWidget上的listen事件不会被取消。我尝试使用dispose,但它不起作用。

@override
  dispose() {
    super.dispose();
    sketchStroke.cancel();
  }

如果有人能指导如何在GuessScreenWidget切换到DrawScreenWidget时取消监听事件,我将不胜感激。

46scxncf

46scxncf1#

Stream<QuerySnapshot<Map<String, dynamic>>> myStream = FirebaseFirestore.instance.collection("handleCountM").limit(1).snapshots();

late StreamSubscription<QuerySnapshot<Map<String, dynamic>>> streamSubscription;
  

void handleDelete() {
    streamSubscription = myStream.listen((value) {
      value.docs.forEach((element) {
        element.reference.delete();
      });
    });
  }

  @override
  void dispose() {
    streamSubscription.cancel(); //Cancel your subscription here.
    super.dispose();
  }

你的另一个选择,将是使用一个streambuilder,它会处理订阅和终止为您。
或者你可以用这个

late CollectionReference reference;
  late StreamSubscription streamSubscription;
  @override
  void initState() {
    // TODO: implement initState
    reference = _firestore.collection(singleAuction.id.toString());
    streamSubscription = reference.snapshots().listen((querySnapshot) {
      for (var element in querySnapshot.docChanges) {}
    });
        super.initState();

  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
   streamSubscription.cancel();
  }

相关问题