Хотя это не мой любимый ответ, я также не уверен, есть ли лучшая альтернатива; это то, что я сделал как временное исправление для будущих наблюдателей:
Создайте новый поток (в моем случае employeeAdded), после добавления сотрудников, также создайте запись в потоке:
final _employees = BehaviorSubject<List<Employee>>(seedValue: List<Employee>());
final _employeeAdded = BehaviorSubject();
// streams (out)
Observable<List<Employee>> get employees => _employees.stream;
Observable<dynamic> get employeesAdded => _employeeAdded.stream;
addEmployee(Employee employee) async {
final newList = <Employee>[]..addAll(_employees.value)..add(employee);
await _employeeRepo.upsertEmployee(employee);
_employees.add(newList);
_employeeAdded.add(true);
//FIXME: Save to db
}
Обратите внимание, что в employeeAdded нет seedValue, это необходимо для того, чтобы при начальной загрузке не отображалась снэк-бар.
На моем экране / странице у меня есть эшафот; это тело вызывает другой метод, который должен объяснить остальную часть кода:
Widget _buildBody(EmployeeBloc bloc) {
return StreamBuilder(
stream: bloc.employees,
builder: (context, snapshot) {
if (!snapshot.hasData) {
bloc.employeesAdded.listen(
(_) => Scaffold.of(context).showSnackBar(
SnackBar(
content: Text('Employee added'),
),
),
);
bloc.seedEmployees();
return Center(
child: Text("No employees"),
);
}
return _buildList(bloc, snapshot.data);
},
);
}
Обратите внимание на прослушивание блока с hasData if.
Пока это работает, но хотелось бы знать, есть ли более аккуратный пример.