【发布时间】:2021-04-17 04:33:09
【问题描述】:
我的应用程序的想法是用户能够添加休假约会。添加新的休假约会后,用户会收到通知消息。为了实现这一点,我有一个休息时间,它对 AddTimeOffEvent 做出反应并设置两个状态 TimeOffAddingState 和 TimeOffAddedState。我正在使用 flutter_bloc 库。
我的集团:
class TimeOffBloc extends Bloc<TimeOffEvent, TimeOffState> {
TimeOffRepository repository;
String activeUser;
TimeOffBloc({@required this.repository}) : super(TimeOffInitialState());
@override
Stream<TimeOffState> mapEventToState(TimeOffEvent event) async* {
if (event is AddTimeOffEvent) {
yield TimeOffAddingState();
try {
var addResult = await repository.addTimeOff(event.timeOff, activeUser);
TimeOffsRange timeOffsRange =
await repository.fetchTimeOffRange(activeUser);
yield TimeOffAddedState(
timeOffs: timeOffsRange, excludedWeekends: addResult);
} catch (e) {
yield TimeOffErrorState(message: e.toString());
}
}
}
}
我的活动:
abstract class TimeOffEvent extends Equatable {}
class AddTimeOffEvent extends TimeOffEvent {
final AddTimeOff timeOff;
AddTimeOffEvent({@required this.timeOff});
List<Object> get props => [timeOff];
}
我的状态:
abstract class TimeOffState extends Equatable {}
class TimeOffInitialState extends TimeOffState {
String message = "Loading";
@override
List<Object> get props => [];
}
class TimeOffAddedState extends TimeOffState {
TimeOffsRange timeOffs;
String excludedWeekends;
TimeOffAddedState({@required this.timeOffs, this.excludedWeekends});
List<Object> get props => [timeOffs, excludedWeekends];
}
class TimeOffAddingState extends TimeOffState {
String message = "Adding new time off appointments.";
@override
List<Object> get props => [message];
}
class TimeOffErrorState extends TimeOffState {
String message;
TimeOffErrorState({@required this.message});
@override
List<Object> get props => [message];
}
集团建设者
在 bloc builder 小部件中检测到从 TimeOffAddingState 到 TimeOffAddedState 的状态变化。
class _TimeOffListContainerState extends State<TimeOffListContainer> {
TimeOffBloc timeOffBloc;
@override
void initState() {
super.initState();
timeOffBloc = BlocProvider.of<TimeOffBloc>(context);
}
@override
Widget build(BuildContext context) {
return RefreshIndicator(
onRefresh: () => getTimeOffs(),
child: BlocBuilder<TimeOffBloc, TimeOffState>(
builder: (context, state) {
if (state is TimeOffInitialState) {
return Loading(loadingMessage: state.message);
} else if (state is TimeOffAddingState) {
return Loading(loadingMessage: state.message);
} else if (state is TimeOffAddedState) {
return TimeOffList(
timeOffs: state.timeOffs, timeOffBloc: timeOffBloc);
} else if (state is TimeOffErrorState) {
return Error(
errorMessage: state.message,
onRetryPressed: () => getTimeOffs(),
);
}
},
),
);
}
}
我有一个 timeOffListPage,用于显示约会时间。页面上有一个 Bloc Listener,它应该在 TimeOffAddesState 上显示一条消息。但这不起作用。在调试过程中,我发现在设置 TimeOffAddingState 时调用了 BlocListener。但是 TimeOffAddedState 被忽略。令人困惑的是,当我没有在 bloc 上产生 TimeOffAddingState 时,bloc 侦听器适用于 TimeOffAddedState。
final TimeOffsRange timeOffs;
final TimeOffBloc timeOffBloc;
const TimeOffList({Key key, this.timeOffs, this.timeOffBloc})
: super(key: key);
@override
Widget build(BuildContext context) {
return BlocListener<TimeOffBloc, TimeOffState>(
listener: (context, state) {
if (state is TimeOffAddedState) { //is never called...
if (state.excludedWeekends.isNotEmpty) {
showSimpleNotification(
Text(state.excludedWeekends),
background: Colors.amber,
duration: Duration(milliseconds: 10000),
);
}
}
},
child: Scaffold(...
有什么想法吗?
【问题讨论】: