Flutter 在颤振中重新启动(再次关闭和打开)后,对话框状态不变

Flutter 在颤振中重新启动(再次关闭和打开)后,对话框状态不变,flutter,dart,bloc,flutter-bloc,Flutter,Dart,Bloc,Flutter Bloc,我已经在一个无状态小部件中定义了一个按钮(这将具有bloc创建逻辑和使用bloc provider进行注入),单击该按钮我将显示一个对话框并将bloc实例传递给它,如代码所示 //EsignBloc is defined here in parent statelessWidget. Defined i.e. creating the bloc instance and passing through the BlocProvider. Removed the code for simplic

我已经在一个无状态小部件中定义了一个按钮(这将具有bloc创建逻辑和使用bloc provider进行注入),单击该按钮我将显示一个对话框并将bloc实例传递给它,如代码所示


//EsignBloc is defined here in parent statelessWidget. Defined i.e. creating the bloc instance and passing through the BlocProvider. Removed the code for simplicity


//This listener will be called when Button defined inside statelessWidget will be clicked. this is responsible for showing the dialog.
void _onClickHere(
    BuildContext context,
  ) {
    final dialog = Dialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(AppConstants.borderRadius),
      ),
      elevation: 0.0,
      backgroundColor: Colors.transparent,
      child: _GetSignUsingOtpView(),
    );

    showDialog(
      context: context,
      builder: (_) => BlocProvider<EsignBloc>(
        create: (_) => BlocProvider.of<EsignBloc>(context), // passing already created bloc to dialog
        child: WillPopScope(
          onWillPop: () => Future.value(false),
          child: dialog,
        ),
      ),
      barrierDismissible: false,
    );
  }


//EsignBloc在父窗口小部件中定义。已定义,即创建bloc实例并通过BlocProvider。为了简单起见,删除了代码
//当单击在无状态小部件中定义的按钮时,将调用此侦听器。这负责显示对话框。
请点击此处(
构建上下文上下文,
) {
最终对话=对话(
形状:圆形矩形边框(
borderRadius:borderRadius.circular(AppConstants.borderRadius),
),
标高:0.0,
背景颜色:颜色。透明,
子项:_GetSignUsingOutView(),
);
显示对话框(
上下文:上下文,
生成器:()=>BlocProvider(
create:()=>BlocProvider.of(context),//将已创建的bloc传递给对话框
孩子:Willposcope(
onWillPop:()=>Future.value(false),
孩子:对话,
),
),
禁止:错误,
);
}
粘贴_getSignUsingotView()的一些代码

class\u GetSignusingotView扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(生成器:(上下文,状态){
返回容器(
装饰:盒子装饰(
颜色:AppColor.white,
borderRadius:borderRadius.circular(
AppConstants.borderRadius,
),
),
子:列(
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
对齐(
对齐:alignment.centerRight,
孩子:InkWell(
onTap:()=>\u关闭对话框(上下文),
孩子:填充(
填充:仅限常量边集(顶部:8.0,右侧:8),
子:图标(
图标。取消,
颜色:AppColor.primaryDark,
尺寸:SizeConfig.safeBlockVertical*2,
),
),
),
),
填充物(
填充:常数边集。全部(24),
子:列(
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
PrimaryText(text:state.otp),//关闭并再次操作对话框后,数据不会更改
PrimaryText(文本:state.remainingTime),//关闭并再次操作对话框后,数据不会更改
],
),
),
],
),
);
});
}
void\u closeDialog(BuildContext上下文){
Navigator.pop(上下文);
}
}

我面临的问题是,每当对话框在关闭后再次打开时,它都不会显示来自bloc的最新数据。该对话框只显示该组中以前的数据。有人能指出我犯了什么错误吗?

对话框没有显示新数据的原因是您正在创建一个新的bloc实例。即使你说你不是

BlocProvider(
create:()=>BlocProvider.of(context),//将已创建的bloc传递给对话框
孩子:。。。
在某些情况下,BlocProvider可用于向小部件树的新部分提供现有立方体。当需要将现有立方体提供给新路由时,最常用这种方法。在这种情况下,BlocProvider不会自动关闭立方体,因为它没有创建立方体

要不创建新实例,您需要使用
BlocProvider.value
。您可以阅读有关它的更多信息

BlocProvider.value(
值:BlocProvider.of(上下文),
孩子:。。。,
);

这将使用以前的实例并将其提供给子窗口小部件,而不是创建新实例,并且在使用完后不会关闭bloc。这便于对话框和导航。

请为您的
EsignState
类添加代码,可能您没有覆盖
equalable
道具我使用冻结注释生成EsignState的代码
class _GetSignUsingOtpView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<EsignBloc, EsignState>(builder: (context, state) {
      return Container(
        decoration: BoxDecoration(
          color: AppColor.white,
          borderRadius: BorderRadius.circular(
            AppConstants.borderRadius,
          ),
        ),
        child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Align(
                  alignment: Alignment.centerRight,
                  child: InkWell(
                    onTap: () => _closeDialog(context),
                    child: Padding(
                      padding: const EdgeInsets.only(top: 8.0, right: 8),
                      child: Icon(
                        Icons.cancel,
                        color: AppColor.primaryDark,
                        size: SizeConfig.safeBlockVertical * 2,
                      ),
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(24),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      PrimaryText(text: state.otp), // data does not change after closing and opeing dialog again 
                      PrimaryText(text: state.remainingTime), // data does not change after closing and opeing dialog again 
                    ],
                  ),
                ),
              ],
            ),
      );
    });
  }

  void _closeDialog(BuildContext context) {
    Navigator.pop(context);
  }
}