flutter 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
....

我读到问题是在流中添加状态管理 (Unnecessary Widget Rebuilds While Using Selector (Provider) inside StreamBuilder) 会使事情变得混乱,并且您必须使小部件构建流有状态并在 initState 中设置流。 我试图遵循这种方式,但我需要上下文来构建我的卡片列表,所以我可以按照上面的提示从 db (firestore) 读取数据......这还不够

有人能指出我正确的方向,还是我必须放弃这个想法并继续前进?

谢谢

解决方法

如果需要上下文,可以尝试在 State 类的 didChangeDependencies 方法中监听流。 使用 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
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...