【发布时间】:2019-12-13 08:49:24
【问题描述】:
我正在尝试使用StreamProvider(来自this 很棒的包),但我一直在努力让特定的流工作。
我创建了一个StreamController,我用它通过它的Sink 将数据添加到它的Stream。所有这些似乎都运行良好。但是当将此Stream 与StreamProvider 一起使用时,小部件树不会反映Stream 的更改。但是,使用StreamBuilder 确实可以正常工作。
使用StreamProvider的代码:
class TestPage extends StatelessWidget {
final Mockup exchange = ExchangeApi.mockup;
@override
Widget build(BuildContext context) {
return StreamProvider<List<Data>>(
builder: (BuildContext context) => Wrapper.mockup.stream,
initialData: null,
catchError: (BuildContext context, e) {
print("Error: $e");
return null;
},
child: TestPageBody(),
);
}
}
class TestPageBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<Data> dataList = Provider.of<List<Data>>(context);
return ListView.builder(
itemCount: dataList?.length ?? 0,
itemBuilder: (BuildContext context, int index) {
return Text(dataList[index].name);
},
);
}
}
我一直在寻找为什么这不起作用,但还没有找到答案。但这里有一些我确实发现的东西:
- 使用 Flutter Desktop Embedding,当窗口调整大小(从而强制重建)时,UI 确实反映了流中的更改。使用热刷新时会看到相同的效果。
- 流不断添加新数据,我通过调试测试了这一点并简单地打印出数据
任何帮助将不胜感激!
【问题讨论】:
-
如果你添加一个
updateShouldNotify: (_, __) => true,这行得通吗? (这只是为了确认一些事情) -
就是这样!再次感谢雷米……但是,你能澄清一下为什么这是必要的吗?我使用的其他流似乎从来没有必要(尽管这可能是巧合)。我认为该属性的用例类似于性能(限制重新渲染)。
标签: flutter dart flutter-provider