Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter FutureBuilder没有';t通过try/catch接收失败后更新_Flutter_Async Await_Future_Flutter Futurebuilder - Fatal编程技术网

Flutter FutureBuilder没有';t通过try/catch接收失败后更新

Flutter FutureBuilder没有';t通过try/catch接收失败后更新,flutter,async-await,future,flutter-futurebuilder,Flutter,Async Await,Future,Flutter Futurebuilder,我有FutureBuilder,它接受来自HTTP GET请求的future。Future对象在点击submit按钮时初始化,该按钮也基于isInEditMode bool 我第一次点击Submit时,它的连接状态从“无”变为“等待”并按预期完成 假设future捕捉到Get请求中的错误,我可以优雅地将其放入catch块中,我得到了connectionState.done,这很好 现在问题出现在第二次点击submit按钮时,它不会将future的connectionState更新为waitin

我有FutureBuilder,它接受来自HTTP GET请求的future。Future对象在点击submit按钮时初始化,该按钮也基于isInEditMode bool

  • 我第一次点击Submit时,它的连接状态从“无”变为“等待”并按预期完成
  • 假设future捕捉到Get请求中的错误,我可以优雅地将其放入catch块中,我得到了connectionState.done,这很好
  • 现在问题出现在第二次点击submit按钮时,它不会将future的connectionState更新为waiting,反过来,生成器也不会相应地显示在屏幕上
  • 我已经检查过了,每次我点击Submit按钮,就会从Get请求中检索到全新的future对象,但它不会反映在FutureBuilder中。如何让FutureBuilder知道Future对象已更新/更改,以适应新对象

类AddEditProductsOSScreen扩展StatefulWidget{
静态常量routeName='/add edit product';
@凌驾
_AddEditProductSoScreenState createState()=>_AddEditProductSoScreenState();
}
类_addeditProductsOSScreenState扩展状态{
var isEditMode=false;
final _formKey=GlobalKey();
ProductFormModel\u formProduct;
未来的submit;
bool isLoadingVisible=false;
@凌驾
小部件构建(构建上下文){
最终产品供应商=
Provider.of(上下文,listen:false);
Product Product=ModalRoute.of(context.settings.arguments);
如果(产品!=null){
isEditMode=true;
_formProduct=ProductFormModel.copyFromProduct(产品);
}否则{
_formProduct=ProductFormModel.init();
}
返回脚手架(
底部导航栏:容器(
身高:50,
儿童:材料(
颜色:主题。背景。强调颜色,
孩子:InkWell(
onTap:isLoadingVisible
无效的
: () {
如果(isEditMode){
Submit的未来=
productsProvider.editProduct(\u formProduct);
}否则{
Submit的未来=
productsProvider.addProduct(_formProduct);
}
isLoadingVisible=true;
Submit的未来。然后((值){
//Navigator.of(context.pop();
}).catchError((错误){
显示对话框(
上下文:上下文,
生成器:(上下文)=>AlertDialog(
标题:Text('发生错误!'),
内容:文本(“出现问题”),
行动:[
扁平按钮(
已按下:(){
Navigator.of(context.pop();
},
child:Text('ok'))
],
));
}).完成时(){
设置状态(){
isLoadingVisible=false;
});
});
},
孩子:未来建设者(
未来:Submit的未来,
生成器:(上下文,异步快照){
if(snapshot.connectionState==connectionState.waiting){
返回对齐(
对齐:对齐.center,
子:容器(
身高:30,
宽度:30,
子对象:循环压缩机指示器(
背景颜色:Colors.white,
)),
);
}否则{
返回容器(
填充:边缘设置。全部(10),
宽度:double.infinity,
子:文本(
“提交”,
样式:TextStyle(颜色:Colors.white,字体大小:20),
textAlign:textAlign.center,
),
);
}
},
),
),
),
),
);
}
}
任何帮助都将不胜感激,谢谢

编辑:这里是productProvider类的addProduct方法,它返回future对象并抛出异常

Future<Response> addProduct(ProductFormModel product) async {
    const url = '................';

    try {
      Response response = await http.post(url,
          body: json.encode({
            'title': product.title,
            'description': product.description,
            'imageUrl': product.imageUrl,
            'price': product.price,
            'isFavorite': product.isFav
          }));

      Map respMap = json.decode(response.body);
      product.id = respMap['name'];
      _items.add(product.toProduct());
      notifyListeners();
      return response;
    } on Exception catch (error) {
      print("error is :: " + error.toString());
      throw Exception('Something went wrong!!');
    }
  }
Future addProduct(ProductFormModel产品)异步{
常量url='……';
试一试{
Response=wait http.post(url,
正文:json.encode({
“title”:product.title,
“description”:product.description,
“imageUrl”:product.imageUrl,
“价格”:产品价格,
“isFavorite”:product.isFav
}));
Map respMap=json.decode(response.body);
product.id=respMap['name'];
_items.add(product.toProduct());
notifyListeners();
返回响应;
}异常捕获时(错误){
打印(“错误为::”+error.toString());
抛出异常('出错了!!');
}
}

要通知框架小部件的状态已更改,可以使用
StatefulWidget
setState
方法

因此:

futureOfSubmit = productsProvider.editProduct(_formProduct);
应该是:

setState(() { futureOfSubmit = productsProvider.editProduct(_formProduct); });
和其他相应的。使用

setState((){})

要通知框架,状态已更改

在If-else块中使用setState

setState(() {
futureOfSubmit = productsProvider.editProduct(_formProduct);
 });
setState(() {
futureOfSubmit = productsProvider.editProduct(_formProduct);
 });