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

Posted

技术标签:

【中文标题】在颤振中重新启动(再次关闭和打开)后对话框状态不会改变【英文标题】:Dialog state does not change after restarting (closing and opening again) in flutter 【发布时间】:2021-03-29 20:38:57 【问题描述】:

我在一个 StatelessWidget 中定义了一个按钮(这将具有 bloc 创建逻辑并使用 bloc 提供程序进行注入),单击该按钮时,我将显示一个对话框并将 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,
    );
  

粘贴一些_GetSignUsingOtpView()的代码

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);
  


我面临的问题是每当对话框在关闭后再次打开时,它都不会显示来自该集团的最新数据。该对话框仅显示该块中的任何先前数据。谁能指出我在哪里犯了错误?

【问题讨论】:

请为您的EsignState 类添加代码,也许您错过了为Equatable 覆盖props 我正在使用冻结注解为 EsignState 生成代码 【参考方案1】:

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

BlocProvider<EsignBloc>(
  create: (_) => BlocProvider.of<EsignBloc>(context), // passing already created bloc to dialog
  child: ...

在某些情况下,BlocProvider 可用于为小部件树的新部分提供现有的肘部。当需要为新路线提供现有肘部时,这将最常用。在这种情况下,BlocProvider 不会自动关闭 cubit,因为它没有创建它。

要不创建新实例,您需要使用BlocProvider.value。你可以阅读更多关于它here

BlocProvider.value(
  value: BlocProvider.of<EsignBloc>(context),
  child: ...,
);

这将使用先前的实例并将其提供给子小部件,而不是创建一个新实例,并且在使用完成后不会关闭该块。这对于对话框和导航很方便。

【讨论】:

以上是关于在颤振中重新启动(再次关闭和打开)后对话框状态不会改变的主要内容,如果未能解决你的问题,请参考以下文章

如何保存单选按钮状态?

如何修复在python中选择文件后不断重新打开的文件对话框

C#无法访问已释放的对象

centos重启后网络默认关闭,需要手动开启,如何解决?

如何在MSI Installshield重新启动管理器对话框中禁用“不关闭应用程序”选项

arcgis未连接