web-dev-qa-db-ja.com

エラー:flutter / lib / ui / ui_Dart_state.cc(157)未処理の例外:タイプ 'Future <dynamic>'はタイプ 'FutureOr <Null>のサブタイプではありません

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

1

これは、関数のタイプが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'

2
veneno

これは、.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
0
Ahmed Ezzat