【问题标题】:Ternary operator not updating alert dialog UI in Flutter三元运算符未在 Flutter 中更新警报对话框 UI
【发布时间】:2022-01-17 19:04:50
【问题描述】:

我有一个警告对话框,其中包含相机包中的相机预览,在我拍照后,我希望警告对话框显示加载屏幕。我希望通过在对话框中使用三元运算符来实现这一点。下面是我按下按钮时调用的对话框,其中 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;
                  });
                },

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

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

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

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

    【讨论】:

    • 这行得通。谢谢。
    猜你喜欢
    • 2020-10-01
    • 2021-11-13
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多