我正在按日期/时间过滤一些文档以首先检索最近的项目。
但是,当向列表中添加新项目时,它被正确添加,但是当重新启动应用程序时,列表会重做并且项目是随机排列的,这不应该发生,因为我是按日期订购的。
可能是我这样做是为了将这些项目添加到列表中。
我是这样做的:
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();
}
答案 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)
会怎样? (将“数据”更改为“日期”)