Firebase 无法正确按日期对项目进行排序

时间:2021-03-21 13:03:56

标签: firebase flutter dart google-cloud-firestore

我正在按日期/时间过滤一些文档以首先检索最近的项目。

但是,当向列表中添加新项目时,它被正确添加,但是当重新启动应用程序时,列表会重做并且项目是随机排列的,这不应该发生,因为我是按日期订购的。

可能是我这样做是为了将这些项目添加到列表中。

我是这样做的:

Future<void> _addListernerFavoritos() async{
  favoritosModel.limparLista();
  List<String> listaBackp = [];

  FirebaseFirestore.instance
      .collection("usuarios")
      .doc(usuario.idUsuario)
      .collection("favoritos")
      .orderBy("data", descending: true)
      .snapshots()
      .listen((snapshot) {

    snapshot.docChanges.forEach((change) async{
      String idEmpresa = change.doc.id;

      switch (change.type) {
        case DocumentChangeType.added:
        //========== quando um favorito for adicionado ==========

          DocumentSnapshot docEmp = await FirebaseFirestore.instance
              .collection("empresas")
              .doc(idEmpresa)
              .get();

          Empresa empresa = Empresa.fromDocumentSnapshot(docEmp);
          if(!favoritosModel.listFavoritos.contains(empresa)){
            //favoritosModel.addFavoritos(empresa);
            favoritosModel.insertFavorito(0, empresa);
          }

          break;
        case DocumentChangeType.modified:
        //========== modificado ==========
          break;
        case DocumentChangeType.removed:
        //========== removido ==========
          favoritosModel.removeWhere(idEmpresa);
          listaBackp.add(idEmpresa);
          break;
      }
    });

    //_sort();
  });
}

我用来更新列表的模型是这样的:

class FavoritosModel = _FavoritosModel with _$FavoritosModel;

abstract class _FavoritosModel with Store{

  @observable
  ObservableList<Empresa> listFavoritos = ObservableList();

  @action
  void insertFavorito(int index, Empresa value){
    listFavoritos.insert(index, value);
  }

  @action
  void addFavoritos(Empresa value) {
    listFavoritos.add(value);
  }

  @action
  void removeWhere(String idEmpresa){
    listFavoritos.removeWhere((empresa) => idEmpresa == empresa.idEmpresa);
  }

  @action
  void limparLista(){
    listFavoritos.clear();
  }

  @action
  void attEmpresa(int index, Empresa value){
    listFavoritos.removeWhere((empresa) => empresa.idEmpresa == value.idEmpresa);
    listFavoritos.insert(index, value);
  }

}

我的 listView 如下所示:

@override
  Widget build(BuildContext context) {

    return Container(
      color: Cores.COR_CINZA_BACKGROUND,
      child: Observer(
        builder: (_){
          FavoritosModel favoritosModel = GetIt.I<FavoritosModel>();
          ObservableList<Empresa> listFavoritos = favoritosModel.listFavoritos;

          if(listFavoritos.length == 0){
            return Container(
              margin: EdgeInsets.only(left: 16, right: 16),
              child: Center(
                child: TextApp(
                  text: "Você ainda não adicionou nenhuma empresa aos favoritos",
                  fontSize: 16,
                  textColor: Cores.COR_DARK_LIGTH,
                  fontFamily: "OpenSans",
                  centralizar: true,
                ),
              ),
            );
          }
          return ListView.builder(
            //reverse: true,
            itemCount: listFavoritos.length,
            itemBuilder: (context, index){

              Empresa empresa = listFavoritos[index];

              if(empresa == null){
                return Container();
              }

              return GestureDetector(
                onTap: (){
                  push(context, TelaEmpresa(empresa: empresa));
                },
                  child: CardEmpresa(empresa: empresa, favoritos: true,));
            },
          );

        },
      ),
    );

  }

在我看来一切都是正确的,我不明白为什么它没有按日期排序。有人可以帮我吗?

我已经尝试过用这两种方式保存日期,但都不起作用:

Timestamp getDataFiltro(){
  var now = new Timestamp.now();
  return now;
}

String getDateNow(){
  var now = new DateTime.now();
  return now.toString();
}

2 个答案:

答案 0 :(得分:1)

问题已解决。

为了解决这个问题,我不得不在所有监听更改中调用 favoritosModel.sort();

下面,我将聆听所做的更改,以帮助遇到同样问题的新人:

Future<void> _addListernerFavoritos() async{
    favoritosModel.limparLista();
    List<String> listaBackp = [];

    FirebaseFirestore.instance
        .collection("usuarios")
        .doc(usuario.idUsuario)
        .collection("favoritos")
        .orderBy("data", descending: true)
        .snapshots()
        .listen((snapshot) {

      snapshot.docChanges.forEach((change) async{
        String idEmpresa = change.doc.id;
        Timestamp dataFiltro = change.doc["data"];

        switch (change.type) {
          case DocumentChangeType.added:
          //========== quando um favorito for adicionado ==========

            DocumentSnapshot docEmp = await FirebaseFirestore.instance
                .collection("empresas")
                .doc(idEmpresa)
                .get();

            Empresa empresa = Empresa.fromDocumentSnapshot(docEmp);
            empresa.dataFiltro = dataFiltro;
            if(!favoritosModel.listFavoritos.contains(empresa)){
              //favoritosModel.insertFavorito(0, empresa);
            }
            favoritosModel.addFavoritos(empresa);

            favoritosModel.sort();
            break;
          case DocumentChangeType.modified:
          //========== modificado ==========
            favoritosModel.sort();
            break;
          case DocumentChangeType.removed:
          //========== removido ==========
            favoritosModel.removeWhere(idEmpresa);
            favoritosModel.sort();
            listaBackp.add(idEmpresa);
            break;
        }
      });

      favoritosModel.sort();
    });

 }

我还要感谢所有试图帮助我的人。

答案 1 :(得分:0)

如果您使用 .orderBy("date", descending: true) 而不是 .orderBy("data", descending: true) 会怎样? (将“数据”更改为“日期”)