作为 AlertDialog 的孩子的 FutureBuilder 不起作用

问题描述

我在 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),RaisedButton(
                          onPressed: () {
                            setState(() {
                              imageUploader(myImage,widget.token);
                            });
                            print("##############134");
                          },children: [
                              Icon(Icons.upload_rounded),Text('Submit'),color: avtar_backGround1,textColor: Colors.white,);
          }
        );
      },);
  }

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

将来我将返回 bool 值,即 true 或 false。 在成功获取数据时也帮助我进行导航。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)