1
Hello, good afternoon!
I am trying to make a query on firebase using Listen to be notified every time a document is changed. However, Listen is always notified but the widget itself is not, even using Observer.
The widget is only changed with the firebase update if I change tab and return to it, which shouldn’t be happening. Yeah, I’m looking at the list with the mobx..
Initstate:
@override
void initState() {
super.initState();
addPedidosListener();
}
Build:
@override
Widget build(BuildContext context) {
final _pedidosBloc = BlocProvider.of<PedidosBloc>(context);
return Observer(
builder: (_){
return ListView.builder(
itemCount: pedidosModel.listPedidos.length,
itemBuilder: (context, index){
if(index == 0){
return Column(
children: [
_parteFiltro(_pedidosBloc),
CardPedido(pedidosModel.listPedidos[index])
],
);
}
return CardPedido(pedidosModel.listPedidos[index]);
},
);
},
);
}
Listen:
Future<void> addPedidosListener() async{
Pedido pedido;
FirebaseFirestore.instance.collection("pedidos").doc("Kwdqc77luBnyPdS2AqD4").collection("pedidos").snapshots().listen((snapshot) {
snapshot.docChanges.forEach((change) {
String pedidoId = change.doc.id;
pedido = Pedido.fromDocumentSnapshot(change.doc);
switch(change.type){
case DocumentChangeType.added:
//========== quando um pedido for adicionado ==========
pedidosModel.addPedido(pedido);
break;
case DocumentChangeType.modified:
//========== modificado ==========
print("modificou");
print(pedido.status);
Pedido pedidoGlobal = Pedido.recuperarPedidoGlobal();
if(pedidoGlobal != null && pedido.idPedido == pedidoGlobal.idPedido){
Pedido.setarPedidoGlobal(pedido);
}
pedidosModel.removeWhere(pedidoId);
pedidosModel.addPedido(pedido);
break;
case DocumentChangeType.removed:
//========== removido ==========
pedidosModel.removeWhere(pedidoId);
break;
}
});
//_sort();
});
}
Mobx:
part 'PedidosModel.g.dart';
class PedidosModel = _PedidosModel with _$PedidosModel;
abstract class _PedidosModel with Store{
@observable
List<Pedido> listPedidos = [];
@action
void addPedido(Pedido value){
listPedidos.add(value);
}
@action
void removeWhere(pedidoId){
listPedidos.removeWhere((pedido) => pedido.idPedido == pedidoId);
}
}