【发布时间】:2019-05-23 00:57:03
【问题描述】:
我的 ApplicationBloc 是小部件树的根。在 bloc 的构造函数中,我正在侦听来自存储库的流,其中包含从 JSON 解码的模型,并将它们转发到 StreamBuilder 侦听的另一个流。
我希望 StreamBuilder 会一一接收模型并将它们添加到 AnimatedList 中。但是有一个问题:StreamBuilder 的构建器只在流中的最后一项触发一次。
例如,有几个模型位于本地存储中,id 为 0、1、2 和 3。所有这些都是从存储库发出的,所有这些都成功放入流控制器中,但只有最后一个模型(id == 3) 出现在 AnimatedList 中。
存储库:
class Repository {
static Stream<Model> load() async* {
//...
for (var model in models) {
yield Model.fromJson(model);
}
}
}
集团:
class ApplicationBloc {
ReplaySubject<Model> _outModelsController = ReplaySubject<Model>();
Stream<Model> get outModels => _outModelsController.stream;
ApplicationBloc() {
TimersRepository.load().listen((model) => _outModelsController.add(model));
}
}
main.dart:
void main() {
runApp(
BlocProvider<ApplicationBloc>(
bloc: ApplicationBloc(),
child: MyApp(),
),
);
}
//...
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
final ApplicationBloc appBloc = //...
return MaterialApp(
//...
body: StreamBuilder(
stream: appBloc.outModels,
builder: (context, snapshot) {
if (snapshot.hasData) {
var model = snapshot.data;
/* inserting model to the AnimatedList */
}
return AnimatedList(/* ... */);
},
),
);
}
}
有趣的通知:在 StreamBuilder 的 _subscribe() 方法中,onData() 回调触发了所需的次数,但 build() 方法只触发了一次。
【问题讨论】:
-
如您所见,
AsyncSnapshot<T>具有data属性,实际上是T data而不是List<T> data- 所以它只保留一个<T>元素而不是列表或数组或其他一些元素容器 -
@pskink 本来就是这个意思。 snapshot.data 仅包含一个元素,该元素将被添加到存储所有接收项目的列表控制器中。