StreamBuilder是否总是在第一帧中收听?

时间:2020-04-21 20:16:27

标签: flutter

StreamBuilder会始终在评估其构造函数的相同微任务/事件循环迭代中开始监听提供的流吗?

假设我有以下测试用例,其中Repository具有streamlatest属性,该属性记录流的最后一个值。我想知道是否可以保证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);
  });
}

0 个答案:

没有答案