0

I'm saving Firebase data in a list using on child Added listener and on child changed listener, it works good, but when i perform push operation and use pop to back to the screen the listeners stops listening. Is there any solutions to fix this.

I used this code from Stackoverflow : Code

Gautham Nadar
  • 45
  • 2
  • 6
  • Please show your push and pop code. Also, do you have code anywhere that cancels the listeners? – GrahamD May 22 '20 at 07:00
  • Use StreamSubscription to cancel listener **My Push code** `Navigator.push(context, MaterialPageRoute(builder: (context) => SweetsDetail(sweets)))` **My Pop code** `Navigator.of(context).pop(true)` – Gautham Nadar May 22 '20 at 07:59

1 Answers1

0

Sorry for this silly post, i'm new to flutter, I fixed this by using Future method in listeners.

@GrahamD you can find my code here.

My code:

var childAddedListener;
var childChangedListener;

@override

void initState(){

FirebaseDatabase database;
database = FirebaseDatabase.instance;
database.setPersistenceEnabled(true);
database.setPersistenceCacheSizeBytes(10000000);

reference = database.reference().child('Sweets');
childAddedListener = reference.onChildAdded.listen(_onEntryAddedShop);
childChangedListener = reference.onChildChanged.listen(_onEntryChangedShop);

super.initState();

}

On Child Added Listener

Future _onEntryAddedShop(Event event) {
setState(() {
  itemsShop.add(Sweets.fromSnapshot(event.snapshot));
});

}

On Child Changed Listener

Future _onEntryChangedShop(Event event) {
print('Child Changed');
var old = itemsShop.singleWhere((entry) {
  return entry.id == event.snapshot.key;
});
setState(() {
  itemsShop[itemsShop.indexOf(old)] = Sweets.fromSnapshot(event.snapshot);
});
getItemIds();

}

Cancel them in dispose

@override
dispose() {
  childAddedListener.cancel();
  childChangedListener.cancel();
  super.dispose();
}
Gautham Nadar
  • 45
  • 2
  • 6