我想推快餐店,如果国家是:

  • PostSuccess -显示snackbar,通过Navigator.pop()转到上一个屏幕;
  • 失败-显示Snackbar and not rebuild the listView.builder
              if (state is EduWorkPostSuccess) {
                showTopSnackBar(
                  Overlay.of(context),
                  CustomSnackBar.success(message: "Everything went alright"),
                );
                Navigator.pop(context);
              } else if (state is EduWorkFailed) {
                showTopSnackBar(
                  Overlay.of(context),
                  CustomSnackBar.error(
                      message: translation.translation[state.msg]),
                );
              }
            }, builder: (context, state) {
              if (state is EduWorkLoaded && state.isChanged) {
                return Padding(
                  padding: const EdgeInsets.all(15.0),
                  child: Center(
                    child: UserDataSectionDesription(
                      description:
                          "Remember to save your changes", //TODO added to translation file, w8ting...
                    ),
                  ),
                );
              } else {
                return SizedBox();
              }
            }
BlocBuilder<EduWorkBloc, EduWorkState>(
              builder: (context, state) {
                if (state is EduWorkLoading) {
                  return Center(
                      child: CircularProgressIndicator(
                    color: Theme.of(context).colorScheme.secondary,
                  ));
                } else if (state is EduWorkLoaded) {
                  return ListView.builder(
                    shrinkWrap: true,
                    itemCount: selectedMap.length,
                    itemBuilder: (context, index) {
                      return Padding(
                        padding: const EdgeInsets.all(8),
                        child: EducationWidget(
                          isSelected: state.eduWork.isSelectedEdu(
                              selectedMap.values.elementAt(index).toString()),
                          index: index,
                          code: selectedMap.values.elementAt(index).toString(),
                          name: selectedMap.keys.elementAt(index).toString(),
                          onPressed: () {
                            final codeName =
                                selectedMap.values.elementAt(index).toString();
                            //if that level of education is selected unselect it
                            if (state.eduWork.education.contains(codeName)) {
                              state.eduWork.education.remove(codeName);

                              BlocProvider.of<EduWorkBloc>(context)
                                  .add(ChangeEdu(state.eduWork));

                              //If unselected add it
                            } else {
                              state.eduWork.education.add(codeName);

                              BlocProvider.of<EduWorkBloc>(context)
                                  .add(ChangeEdu(state.eduWork));
                            }
                          },
                        ),
                      );
                    },
                  );
                }
                return Text('Error');
              },
            ),

此时此刻,.Success正在正常运作.当状态为FAIL时,Snackbar会正常显示,但会返回文本(‘Error)’.我怎么才能解决这个问题?

推荐答案

你说"状态是失败的,Snackbar正确显示,但它返回文本(‘错误)’"

在BlockBuilder中,您会看到"Return Text(‘Error’);"

如果您有一个错误,您的状态将是"教育工作失败",在您的验证中,您有:

"If(State Is EduWorkLoading)"和"Else If(State Is EduWorkLoaded)".

因此,当状态为EduWorkFailed时,对于前面的验证,您只能返回"Text(‘Error’);".您必须更改小部件以显示不同的内容,在BlockBuilder中放置一个新状态或考虑"EduWorkFailed",因为当您发出新状态时,您必须处理该状态,或者当您发出状态时,BlockBuilder必须刷新子状态.

https://pub.dev/documentation/flutter_bloc/latest/flutter_bloc/BlocBuilder-class.html

可以实现一个可选的buildWhen,以便更细粒度地控制BlocBuilder的重建频率,这就是文档

(对于测试,如果您不使用"Navigator.pop(context);",则显示的小部件应该是"Text('Error');")

在这一部分中:

if (state is EduWorkPostSuccess) {
            showTopSnackBar(
              Overlay.of(context),
              CustomSnackBar.success(message: "Everything went alright"),
            );
            Navigator.pop(context);
          }

Flutter相关问答推荐

无法在Flatter中设计正确的布局

Android Studio中的Ffltter&;Couchbase:进程C:/Program Files/Git/bin/bash以非零退出值35结束

如何在表格日历标题下方添加文本?

Android上火焰瓷砖之间的线条飘动

一个API中有两个不同JSON响应的Flutter 改装问题

如果我使用搜索栏,如何在嵌套滚动视图中停止自动滚动?

为Android生成时出现Flutter 错误:给定资源值的<;COLOR&>无效

Flutter在CustomPainter的右上角和左上角添加了2条曲线

请求已在 flutter 中发送到 django 服务器,并且已返回响应,但条件仍然为 false

flutter Listview构建器溢出

来自服务器的数据未分配给变量

在 flutter 中获取最喜欢的文档

Paypal 支付网关添加带有 magento 2 网络详细信息用户名、密码、签名 Magento 2 的 flutter 应用程序?

通过一个具体的例子理解Flutter约束的本质

Flutter sliver 持久化

Riverpod 在使用冻结副本更新状态时触发重建,即使没有任何更改

try 为两个下拉值添加共享首选项,但在 Flutter 上显示错误断言失败:?

如何在flutter中共享容器和gridview之间的滚动条?

如何将 pushNamed 与 Dismissible Widget 一起使用并查看背景透明第一页

FLUTTER+SQL:在 ListViewBuilder 中显示数据库中的数据