gpt4 book ai didi

flutter - StreamProvider 不更新状态

转载 作者:IT王子 更新时间:2023-10-29 06:39:09 25 4
gpt4 key购买 nike

我正在尝试使用 StreamProvider(来自 this awesome package),但我一直在努力让特定的流工作。

我创建了一个 StreamController,我用它通过它的 Sink 将数据添加到它的 Stream。所有这一切似乎工作正常。但是,当将此 StreamStreamProvider 一起使用时,小部件树不会反射(reflect) 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 确实反射(reflect)了流中的变化。使用热刷新时会看到相同的效果。
  • 流不断添加新数据,我通过调试并简单地打印出数据来测试这一点

如有任何帮助,我们将不胜感激!

最佳答案

大多数提供程序(不包括 ChangeNotifierProvider)的默认行为是假定传递的值是不可变的。

因此,如果您的流发出与之前发出的值相同的值,则不会重建依赖项。

有两种解决方法:

  • 使流发出的值不可变,以便执行 previousValue == newValue 正常工作。

  • 覆盖 updateShouldNotify 以在值未更改时不过滤值。

    一个简单的 updateShouldNotify: (_, __) => true 就可以了。


在理想世界中,更喜欢不变性。

这可以通过在将对象发送到 streamController.add(value) 之前复制对象来完成:

List<T> value;
streamController.add(List.from(value));

第二个(可选)步骤是覆盖 updateShouldNotify(或对象上的 operator==)以通知提供者该值未更改。

对于 List,这可以使用 collection/collection.dart 中的 ListEquality 来完成:

import 'package:provider/provider.dart';
import 'package:collection/collection.dart';

StreamProvider<List<int>>(
builder: (_) => stream,
updateShouldNotify: const ListEquality<int>().equals,
);

关于flutter - StreamProvider 不更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57365207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com