StreamBuilder
会始终在评估其构造函数的相同微任务/事件循环迭代中开始监听提供的流吗?
假设我有以下测试用例,其中Repository
具有stream
和latest
属性,该属性记录流的最后一个值。我想知道是否可以保证StreamBuilder
在这种情况下不会错过任何事件。
是否可能发生initialData
属性在构造函数调用中被求值(latest
== 0),然后流异步发出新事件(设置latest
== 1)StreamBuilder
尚未订阅stream
时,因此流仅丢弃事件(因为它是广播流)。然后,在下一个事件循环迭代中,StreamBuilder
最终订阅该流,但是没有接收到最新事件(因为该流是广播流,并且不缓冲事件),因此值为== 1的事件为迷路了。
我为此实现了一个测试用例,它可以按预期工作,但是我不确定我是否很幸运,由于testWidgets
的fakeAsync区域,它的表现是否如预期的那样,或者实际上是否可以保证通过框架。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
class Repository {
final controller = StreamController<int>.broadcast();
Stream<int> get stream => controller.stream;
int latest = 0;
Repository() {
_fetch();
}
Future<void> _fetch() async {
await Future.delayed(Duration.zero);
controller.add(1);
latest = 1;
}
}
void main() {
testWidgets('stream events', (tester) async {
var repo = Repository();
await tester.pumpWidget(
MaterialApp(
home: StreamBuilder(
initialData: repo.latest,
stream: repo.stream,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
print('building with i=${snapshot.data}');
return Text('i=${snapshot.data}');
},
),
),
);
await tester.pump(Duration.zero);
expect(find.text('i=1'), findsOneWidget);
});
}