ShowDialogでhttpリクエストからのエラーを処理してからエラーをスローしようとしていますが、このバグに直面しています
エラー
E/flutter(18769):#13 TextInput._handleTextInputInvocation package:flutter /…/ services/text_input.Dart:968 E/flutter(18769):#14 MethodChannel._handleAsMethodCall package:flutter /…/ services/platform_channel.Dart:402 E/flutter(18769):#15 MethodChannel.setMethodCallHandler。パッケージ:flutter /…/ services/platform_channel.Dart:370 E/flutter(18769):#16
_ DefaultBinaryMessenger.handlePlatformMessageパッケージ:flutter /…/ services/binding.Dart:200 E/flutter(18769):#17
_ invoke3。 (Dart:ui/hooks.Dart:303:15)E/flutter(18769):#18 _rootRun(Dart:async/zone.Dart:1126:13)E/flutter(18769):#19 _CustomZone.run(Dart :async/zone.Dart:1023:19)E/flutter(18769):#20 _CustomZone.runGuarded(Dart:async/zone.Dart:925:7)E/flutter(18769):#21 _invoke3(Dart:ui /hooks.Dart:302:10)E/flutter(18769):#22
_ dispatchPlatformMessage(Dart:ui/hooks.Dart:162:5)
Future<void> addProduct(Product product) {
const url = 'https://flutter-shop-768a7.firebaseio.com/products.jon';
return http
.post(url,
body: json.encode({
'title': product.title,
'description': product.description,
'imageUrl': product.imageUrl,
'price': product.price,
'isFavorite': product.isFavorite
}))
.then((response) {
final newProduct = Product(
title: product.title,
description: product.description,
imageUrl: product.imageUrl,
price: product.price,
id: json.decode(response.body)['name']);
// _items.insert(index, element)
_items.add(newProduct);
notifyListeners();
}).catchError((error) {
throw error;
});
}
Provider.of<Products>(context, listen: false)
.addProduct(_edditedProduct)
.catchError((error) {
return showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('An Error occurred!'),
content: Text('Someghing went wrong'),
actions: <Widget>[
FlatButton(
child: Text('ok'),
onPressed: () async => Navigator.of(context).pop())
],
),
);
}).then((_) {
print('this is then function');
setState(() {
_isLoading = false;
});
Navigator.pop(context);
});
これは、関数のタイプがFutureであり、戻り値のタイプがFutureである必要があるが、エラーが発生した場合、応答がErrorをスローし、Nullを返すため、このような非同期関数を記述する方がよい
addProduct(Product product) async {
const url = 'https://flutter-shop-768a7.firebaseio.com/products.json';
await http
.post(url,
body: json.encode({
'title': product.title,
'description': product.description,
'imageUrl': product.imageUrl,
'price': product.price,
'isFavorite': product.isFavorite
}))
.then((response) {
final newProduct = Product(
title: product.title,
description: product.description,
imageUrl: product.imageUrl,
price: product.price,
id: json.decode(response.body)['name']);
// _items.insert(index, element)
_items.add(newProduct);
notifyListeners();
}).catchError((error) {
throw error;
});
}
そしてあなたのURLは正しくありません'https://flutter-shop-768a7.firebaseio.com/products.jon'
から'https://flutter-shop-768a7.firebaseio.com/products.json'
これは、.then((response) {})
メソッドの戻り値の型を指定しなかったために発生しました。
.then((response) {
final newProduct = Product(
title: product.title,
description: product.description,
imageUrl: product.imageUrl,
price: product.price,
id: json.decode(response.body)['name']);
// _items.insert(index, element)
_items.add(newProduct);
notifyListeners();
})
に
.then<void>((response) {
final newProduct = Product(
title: product.title,
description: product.description,
imageUrl: product.imageUrl,
price: product.price,
id: json.decode(response.body)['name']);
// _items.insert(index, element)
_items.add(newProduct);
notifyListeners();
})de here