使用 Navigator.of().pop 后丢失块状态

问题描述 投票:0回答:1

我有一个带有 3 页链接的底部应用程序栏,中间有一个用于弹出对话框的按钮。

在成功/失败事件后关闭 showModalBottomSheet 对话框时,它会删除该对话框,但随后默认为空白页面。这种情况只发生在我有

BlocConsumer
的 2 页中。
我正在使用
Navigator.of(context).pop();
关闭导航器。

如果我向其中添加显式块,那么它可以工作,但它需要用于正确的页面。

context.read<HabitsBloc>().add(HabitsFetchAllHabits())

我猜测关闭对话框时它不会再次重新获取上一页的 initState() ,但我认为我不需要这样做。

用户流程说明:

主页 - 有一个按钮可以触发

showModalBottomSheet
主页 - 有一个包含 3 个页面的底部应用栏,其中 2 个页面是有状态的 blocconsumers。

对话框失败将触发此显示nackbar并使用pop()删除对话框;

 if (state is HabitEntrySaveFailure) {
        showOverlaySnackBar(context, state.error);
        Navigator.of(context).pop();
        
  }

如果堆栈后面的页面/小部件位于 BlocConsumer 中,则构建器内不会显示任何内容,就像状态丢失或其他东西

   body: BlocConsumer<HabitsBloc, HabitsState>(
    listener: (context, state) {
      if (state is HabitsGetFailure) {
        showSnackBar(context, state.error);
      }
    },
    builder: (context, state) {
      if (state is HabitsLoading) {
        return const Loader();
      }
      if (state is HabitsGetSuccess) {

因此

HabitsGetSuccess
的上下文似乎已被删除,并显示一个空白页面,因为这就是我的后备。

但是如果我将其添加到上面的侦听器中,那么它可以正常工作,但我宁愿不这样做,因为还有另外两个页面具有不同的 Bloc 事件,用户可以从应用程序栏索引上触发对话框。

        if (state is HabitEntrySaveFailure) {
        print('HabitEntry Failure here');
        showOverlaySnackBar(context, state.error);
      
        Navigator.of(context).pop();
        context.read<HabitsBloc>().add(HabitsFetchAllHabits());
        
      }
flutter bloc
1个回答
0
投票

我认为使用多块提供商可以解决您的问题,并且应用程序不会失去导航栏的状态您可以阅读这篇文章我认为这会对您有所帮助 bloc_文档

© www.soinside.com 2019 - 2024. All rights reserved.