【发布时间】: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