флаттер StreamBuilder и AnimatedWidget

Я борюсь со следующей проблемой:

Я создал список виджетов с помощью StreamBuilder (и сделал его доступным для поиска). Виджеты представляют собой карты, и внутри них пользователь может сделать свой выбор, а затем нажать кнопку. Все работает нормально.

Затем я хотел добавить небольшую анимацию и сделать значок, связанный с кнопкой, анимированным. Теперь это беспорядок, StreamBuilder находится в бесконечном цикле, и у меня также есть проблема в моем списке. Если я закомментирую анимированный значок и снова вставлю предыдущий значок ... все снова начнет работать нормально.

...
                child: FloatingActionButton(
                  onPressed: (){
                    addFood();
                    mealListState.getAcontroller(id).forward();
                  },
                  child:
//                    MyAddIcon(id),  //--> my animated Icon. It does not work
                  Icon(Icons.add),    //--> it works
....

Я читал, что проблема в том, что добавление управления состояниями (ненужных перестроек виджетов При использовании Selector (Provider) внутри StreamBuilder) внутри потока все портится, и вам нужно сделать виджет, создающий поток с сохранением состояния, и настроить поток в initState. Я попытался пойти по этому пути, но мне нужен контекст для создания списка карточек, поэтому я могу следовать приведенному выше совету, просто чтобы прочитать данные из db (firestore) и ... этого недостаточно

Может ли кто-нибудь указать мне правильное направление, или я должен оставить идею и двигаться дальше?

Спасибо


person G4m    schedule 07.02.2021    source источник


Ответы (1)


Если вам нужен контекст, вы можете попробовать прослушать поток в didChangeDependencies вашего класса State. Используйте Streamsubscription, возвращенный stream.listen, чтобы отменить подписку, например, чтобы избежать подписки дважды или даже больше:

@override
didChangeDependencies() {
    final stream = Provider.of<MyStream>(context); // context available here.
    if (this.streamsubscription != null) {
        this.streamsubscription.cancel();
    }
    this.streamsubscription = stream.listen((value) {
    // your callback code here
    });
    super.didChangeDependencies(); // important
}
person Tobias Braun    schedule 07.02.2021
comment
Спасибо, Тобиас, не получилось :( Я сдаюсь ... по крайней мере, пока :) - person G4m; 07.02.2021