虽然这不是我最喜欢的答案,但我也不确定是否有更好的选择;这是我为未来的观察者做的临时修复:
创建一个新流(在我的例子中是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,这是为了防止snackbar 在初始加载时显示。
在我的屏幕/页面中,我有一个脚手架;它的主体调用了另一个应该解释其余代码的方法:
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 对 bloc 进行侦听。
这暂时有效,但想知道是否有更简洁的示例。