【问题标题】:FutureBuilder as child of AlertDialog not workingFutureBuilder 作为 AlertDialog 的子项不起作用
【发布时间】:2021-06-25 11:40:26
【问题描述】:

我在 AlertDialog 框中有 FutureBuilder。最初,单击浮动操作按钮时会打开一个警报对话框,其中有一个提交按钮。单击它时,我会调用另一个带有 FutureBuilder 的函数,因为我想在相同的 AlertDialog 框中显示一个加载图标,同时获取替换整个先前内容的数据。成功获取数据后,我想将用户导航到弹出该警报对话框的新页面。但是看起来futurebuilder的未来正在工作,但builder没有。我尝试使用StatefulBuilder,但似乎没有帮助。

对话框功能

Future<void> _showMyDialog() async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return StatefulBuilder(
          builder: (context, setState) {
            return AlertDialog(
              title: Text('Your Image'),
              content: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Padding(
                    padding: const EdgeInsets.all(18.0),
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(8.0),
                      child: Image.file(File(image.path)),
                    ),
                  ),
                  Container(

                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        RaisedButton(
                          onPressed: () {
                            Navigator.of(context).pop();
                          },

                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: [
                              Icon(Icons.clear_rounded),
                              Text('Cancel'),
                            ],
                          ),
                          color: Colors.white,
                          textColor: avtar_backGround1,
                          shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(5.0),
                              side: BorderSide(width: 0.1)),
                          padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
                        ),
                        RaisedButton(
                          onPressed: () {
                            setState(() {
                              imageUploader(myImage, widget.token);
                            });
                            print("##############134");
                          },
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: [
                              Icon(Icons.upload_rounded),
                              Text('Submit'),
                            ],
                          ),
                          color: avtar_backGround1,
                          textColor: Colors.white,
                          shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(5.0),
                              side: BorderSide(width: 0.1)),
                          padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            );
          }
        );
      },
    );
  }

FutureBuilder 函数:

FutureBuilder imageUploader(PickedFile myImage,String token) {
    return FutureBuilder(
      future: imageFutureCaller(myImage,token),
      builder: (BuildContext context, AsyncSnapshot snapshot){
        if (snapshot.hasError) {
          print("++++++++ ${snapshot.error}");
          return Center(
            child: Container(
              child: Text(
                '${snapshot.error} occured',
                style: TextStyle(fontSize: 18),
              ),
            ),
          );
        }
        else if(snapshot.hasData){
          if(snapshot.data==true){
            print("fffffffff");
             Navigator.pushReplacement(
                context,
                MaterialPageRoute(
                    builder: (context) =>
                        Confetti()));
                 return Container(height: 0.0,width: 0.0,);
          }
          else{
            return Container(child: Text("Sorry!, Image not uploaded"));
          }
        }
        else{
          return Center(
            child:CircularProgressIndicator()
          );
        }
      },
    );
  }

未来功能

Future<bool> imageFutureCaller(PickedFile myImage, String token) async {
    try {
      String filename = myImage.path.toString();
    
      var request = await http.MultipartRequest(
          'POST', Uri.parse('http://green-earth.herokuapp.com/uploadphoto'));
      request.headers['authorization'] = 'Bearer '+token;
     
      request.files.add(await http.MultipartFile.fromPath('image', filename));
    var res = await request.send();
 
    if (res.statusCode == 200) {
    print("image uploaded");
    _dataAvailable=true;
    successfulUploadedDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
    return true;
    } else {
    _dataAvailable=true;
    return false;
    print('error');
    }
    } catch (e) {
    print(e);
    print("image not uploaded");
    }
  }
}

将来我将返回布尔值,即真或假。 在成功获取数据时也帮助我导航。

【问题讨论】:

    标签: flutter android-alertdialog future stateful flutter-futurebuilder


    【解决方案1】:

    将 imageUploader 设为异步函数并等待结果。

    Future<bool> imageUploader(PickedFile myImage,String token) async {
      final result = await imageFutureCaller(myImage,token);
    }
    

    然后 onPressed 等待结果。

    onPressed: () async {
        final result = await imageUploader(myImage, widget.token);
        if (result) {
          Navigator.pop(context);
          // do something
        }
      },
    

    【讨论】:

    • imageuploader 函数中的 futurebuilder 在哪里?我已经为我未来的调用函数添加了代码。我需要 futurebuilder 来显示进度指示器和错误文本。已添加
    • 我有一个问题,您在 imageuploader 中返回了一些小部件,但是您在哪里显示它们?我的意思是在 onPressed 函数中,除了 setState 之外,您没有引用,那么您在哪里显示返回的小部件?如果我知道这一点,我可以更好地帮助你。
    • 我在想,有状态的构建器会死掉,它会在设置 staten 时自动更改对话框中的内容,并在函数 imageUploader 中使用未来构建器的内容。但如果它不正确,那么请提出方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2021-11-23
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2021-05-11
    相关资源
    最近更新 更多