Список фильтров Flutter + Firestore странный результат - PullRequest
0 голосов
/ 27 октября 2019

Я получил список из пожарного магазина. Как пример: рестораны.

[restaurant 1 with all info, restaurant 2 w a i, restaurant 3 w a i]

Я отображаю его в виде списка, и все работает.

List<Post> filteredPosts;
List<Post> posts;


class _DealsfState extends State<Dealsf> {


  @override
  void initState() {
    super.initState();
    getDeals();
  }

  void getDeals() async {

    QuerySnapshot snapshot = await Firestore.instance
        .collection('deals')
        .document('${widget.stad.toLowerCase()}')
        .collection('deals')
        .where('on${widget.day}Night', isEqualTo: true)
        .where('endTime', isGreaterThanOrEqualTo: currentHour())
        .orderBy('endTime', descending: false)
        .getDocuments();
    List<Post> almostposts =
        snapshot.documents.map((doc) => Post.fromDocument(doc)).toList();
    setState(() {
      posts = almostposts;
    });
  }

  buildTimeline() {
    if (filteredPosts == null) {
      if (posts == null) {
        return Container(
          child: Text(
            "loading",
            style: TextStyle(color: Colors.red),
          ),
        );
      } else if (posts.isEmpty) {
        return Text("No posts");
      } else {
        return ListView(children: posts);
      }
    } else {
      if (filteredPosts.isEmpty) {
        return Text("No posts");
      } else {
        return ListView(children: filteredPosts);
      }
    }
  }


  void showFilterDialog({BuildContext context}) {
    showDialog(
      context: context,
      builder: (BuildContext context) => CalendarPopupView(
        barrierDismissible: true,
        initialEndDate: null,
        initialStartDate: null,
        onApplyClick: (DateTime startData, DateTime endData) {
          setState(() {
          });
        },
        onCancelClick: () {},
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    double screenWidth = MediaQuery.of(context).size.width;
    return Flexible(
      child: Container(
        width: screenWidth * (9 / 10),
        height: screenHeight * (3.65 / 5),
        child: Stack(
          children: <Widget>[
            buildTimeline(),
            Container(child: button that opens the 'showFilterDialog')

Я запрограммировал механизм фильтра, например:

filteredList = initialList.where((snapshot) => snapshot.4stars == true).toList();

Но когда я отображаю отфильтрованный список (в качестве замены initalList), происходят действительно странные вещи, иногда он показывает неправильный элемент или дублирует элемент.

Я думал, что сделал ошибку смеханизм фильтрации, но когда я передаю фильтрованный список в новое «окно» с помощью Flutter Navigator, он прекрасно показывает элементы, которые я отфильтровал в новом окне.

Что я делаю неправильно? Есть ли возможность перестроить класс виджетов statefull, чтобы он мог отображать правильно отфильтрованные элементы?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...