使用 MVC 的 Flutter 对话框

Flutter dialog with MVC

我正在尝试显示一个带有 MVC 模式的对话框。

我希望对话框成为一个小部件。像这样:

AlertDialog gameDecisionDialog({
  required VoidCallback onClick,
  required String strDecision,
  required Color decisionColor,
  required BuildContext context,
}) {
  return AlertDialog(
    titleTextStyle: const TextStyle(
      fontWeight: FontWeight.bold,
      color: Colors.black,
      fontSize: 20,
    ),
    actionsOverflowButtonSpacing: 20,
    actions: [
      ElevatedButton(
        onPressed: () {
          Navigator.of(context).pop();
          return onClick();
        },
        child: const Icon(Icons.next_plan_outlined),
      ),
    ],
    content: Text(strDecision),
  );
}

该对话框将在模型层调用。根据应用程序期间发生的情况,将出现一个对话框。问题是 context 部分。

将上下文从视图层向下传递到控制器层,然后再传递到模型层是否有意义?似乎效率低下。

关于如何做到这一点有什么想法吗?我试图避免在视图层中出现对话框,它会变得太乱。

----------------更新

将我的代码修改为以下建议,但现在我的警告对话框没有显示。

看下面的代码(当点击按钮时做一些事情然后显示对话框):

elevatedRectButton(
                    onClick: () {
                      setState(() {
                        MyController.stop();
                        gameDecisionDialog(
                          onClick: () {
                            MyController.start();
                          },
                          gameDecision: MyController.getGameDecision,
                          decisionColor: Colors.amber,
                          context: context,
                        );
                      });
                    },
                    mIcon: const Icon(Icons.do_not_touch),
                    subText: 'STOP',
                    minWidth: 20,
                    height: 20,
                    bgColor: Colors.red,
                  ),

我担心在小部件内调用小部件可能会导致此问题?

不建议将 BuildContext 传递到 model/controller。尝试在模型中的工作完成后或抛出错误时从小部件调用警报。

Example: 

onPress: () async {

  //Some trigger callback 

  startLoading(); 

  await controller.doWork().catchError((e) {
    stopLoading();
    showAlert(context, 'Some Message etc');
  });

  stopLoading();
 
}