Bra*_*sen 6 dart flutter flutter-provider
我正在尝试使用StreamProvider(来自这个很棒的包),但我一直在努力让特定的流工作。
我创建了一个StreamController我用来Stream通过它的Sink. 所有这些似乎都运行良好。但是当将它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);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找为什么这不起作用,但还没有找到答案。但这里有一些我确实发现的东西:
任何帮助将不胜感激!
Rém*_*let 13
大多数提供者(不包括ChangeNotifierProvider)的默认行为是假设传递的值是不可变的。
因此,如果您的流发出与先前发出的值相同的值,则不会重建依赖项。
有两种解决方案:
使您的流发出的值不可变,以便previousValue == newValue正确执行。
updateShouldNotify如果值未更改,则覆盖以不过滤值。
一个简单的updateShouldNotify: (_, __) => true就行了。
在理想的世界中,更喜欢不变性。
这可以通过在将对象发送到streamController.add(value):
List<T> value;
streamController.add(List.from(value));
Run Code Online (Sandbox Code Playgroud)
第二个(可选)步骤是覆盖updateShouldNotify(或operator== 在您的对象上)以通知提供者该值未更改。
使用List,这可以使用ListEqualityfrom来完成collection/collection.dart:
import 'package:provider/provider.dart';
import 'package:collection/collection.dart';
StreamProvider<List<int>>(
builder: (_) => stream,
updateShouldNotify: const ListEquality<int>().equals,
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3517 次 |
| 最近记录: |