三元运算符未更新 Flutter 中的警报对话框 UI

Ternary operator not updating alert dialog UI in Flutter

我有一个警告对话框,其中包含相机包中的相机预览,在我拍照后,我希望警告对话框显示加载屏幕。我希望通过在对话框中使用三元运算符来完成此操作。下面是我按下按钮时调用的对话框,其中 isCalculating 是一个最初设置为 false 的布尔值,_initializeControllerFuture 初始化相机,Loading() 是加载屏幕,Stack() 有相机预览以及其他一些东西。

cameraDialog(context) async {
    await showDialog(
      barrierDismissible: false,
      context: context,
      builder: (_) => AlertDialog(
        insetPadding: EdgeInsets.all(5.0),
        contentPadding: EdgeInsets.all(3.0),
        content: FutureBuilder<void>(
          future: _initializeControllerFuture,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              return isCalculating
                  ? Loading()
                  : Stack(

在 cameraDialog 中,我有一个按钮可以拍照,将 bool isCalculating 设置为 true,运行一些其他代码,然后将 bool isCalculating 设置回 false。在此期间,我希望警报对话框更新其 UI 并显示 Loading() 小部件。下面是 cameraDialog 中按钮的按下事件:

onPressed: () async {
                  originalFile = await controller.takePicture();
                  setState(() {
                    isCalculating = true;
                  });
                  ... other code is run here ...
                  Navigator.of(context).pop();
                  setState(() {
                    isCalculating = false;
                  });
                },

如您所见,cameraDialog 是一个由 onPressonTap 等函数触发的函数。当您调用 setState 时,它实际上调用了 Widget build(BuildContext context) 方法并重建了小部件树,但它从不处理函数的状态或函数内容的内部。所以在你使用它的地方调用 setState 是没有用的。那你能做什么?你可以创建一个 StatefullWidget ex- MyAlertDialog 并将其显示为

onTap: ()=> showDialog(context: context, builder: (ctx) => MyAlertDialog()),

MyAlertDialog 中,您可以像在这里一样处理您的状态。