flutter - Flutter BLOC 状态更新但始终为空值
问题描述
我context.read<SurveyBloc>().add(SurveyModeChanged(mode: 'draft'));
在 bloc 文件状态更改被触发但值始终为 null 时更新状态 bloc 构建器上下文。在过去的两天里,我遇到了这个问题,请帮助解决这个问题。
if (event is SurveyModeChanged) {
print('mode==>');
print(state.mode);
yield state.copyWith(mode: state.mode);
}
这是测量屏幕文件
class SurveyView extends StatefulWidget {
@override
State<StatefulWidget> createState() => _SurveyViewState();
}
class _SurveyViewState extends State<SurveyView> {
@override
Widget build(BuildContext context) {
final sessionCubit = context.read<SessionCubit>();
return BlocProvider(
create: (context) => SurveyBloc(
user: sessionCubit.selectedUser ?? sessionCubit.currentUser,
surveyId: '4aa842ff-2b7d-4364-9669-29c200a3fe9b',
dataRepository: context.read<DataRepository>(),
),
child: BlocListener<SurveyBloc, SurveyState>(
listener: (context, state) {},
child: Scaffold(
backgroundColor: Color(0xFFF2F2F7),
appBar: _appbar(),
body: stepFormContainer(context),
resizeToAvoidBottomInset: false,
),
),
);
}
Widget saveButton() {
return BlocBuilder<SurveyBloc, SurveyState>(builder: (context, state) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: ElevatedButton.icon(
onPressed: () {
context
.read<SurveyBloc>()
.add(SurveyModeChanged(mode: 'draft'));
},
label: Text('Save')));
});
}
}
这是我的调查事件代码
abstract class SurveyEvent {}
class SurveyResultChanged extends SurveyEvent {
final String surveyResult;
SurveyResultChanged({this.surveyResult});
}
class SurveyModeChanged extends SurveyEvent {
final String mode;
SurveyModeChanged({this.mode});
}
class SurveyIdChanged extends SurveyEvent {
final String surveyId;
SurveyIdChanged({this.surveyId});
}
class SaveSurveyChanges extends SurveyEvent {}
调查州飞镖
class SurveyState {
final User user;
final FormSubmissionStatus formSubmissionStatus;
final String surveyId;
final String mode;
final String surveyResult;
SurveyState(
{@required User user,
@required String surveyId,
String mode,
String surveyResult,
this.formSubmissionStatus = const InitialFormStatus()})
: this.user = user,
this.surveyId = surveyId,
this.mode = mode,
this.surveyResult = surveyResult;
SurveyState copyWith({
User user,
FormSubmissionStatus formSubmissionStatus,
String surveyId,
String mode,
String surveyResult,
}) {
return SurveyState(
user: user ?? this.user,
surveyId: surveyId ?? this.surveyId,
mode: mode ?? this.mode,
surveyResult: surveyResult ?? this.surveyResult,
formSubmissionStatus:
formSubmissionStatus ?? this.formSubmissionStatus);
}
}
调查块.dart
class SurveyBloc extends Bloc<SurveyEvent, SurveyState> {
final DataRepository dataRepository;
SurveyBloc({
@required User user,
@required String surveyId,
this.dataRepository,
}) : super(SurveyState(user: user, surveyId: surveyId));
@override
Stream<SurveyState> mapEventToState(SurveyEvent event) async* {
if (event is SurveyModeChanged) {
print('mode==>');
print(state.mode);
yield state.copyWith(mode: state.mode);
}
}
}
解决方案
class SurveyBloc extends Bloc<SurveyEvent, SurveyState> {
final DataRepository dataRepository;
SurveyBloc({
@required User user,
@required String surveyId,
this.dataRepository,
}) : super(SurveyState(user: user, surveyId: surveyId));
@override
Stream<SurveyState> mapEventToState(SurveyEvent event) async* {
if (event is SurveyModeChanged) {
print('mode==>');
print(state.mode);
// This is where the problem occurs. You are emitting the state
// value again and again which is null. Change this:
yield state.copyWith(mode: state.mode);
// into this:
yield state.copyWith(mode: event.mode);
}
}
}
推荐阅读
- javascript - 在 heroku 上托管应用程序后无法连接到 SQL Server
- javascript - 使用 try 在异步函数中设置超时,并且 catch 不会捕获错误
- python - 如何在 Keras 中创建自定义回调?
- python - 替换字符串列表中的函数
- python - Python 等效于 Scala 选项以避免 NoneType 没有属性错误?
- javascript - 在 HTML JavaScript 中将文本添加到输出
- c# - 如何在 Unity 3D 中拥有一个留在场景中且不会重新创建的对象
- python - Pip install 和 Easy install Django 和 VirtualEnv 不工作
- c# - RDLC XML 数据源给出错误:“无法为数据集创建数据读取器
" - python-3.x - Element() 最多接受 3 个位置参数(给定 10 个)