首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:flutter/lib/ui/ui_dart_state.cc(157)未处理的异常:类型'Future<dynamic>‘不是'FutureOr<Null>’的子类型

错误:flutter/lib/ui/ui_dart_state.cc(157)未处理的异常:类型'Future<dynamic>‘不是'FutureOr<Null>’的子类型
EN

Stack Overflow用户
提问于 2020-01-23 07:47:44
回答 3查看 8.2K关注 0票数 2

我正在尝试在showDialog中处理来自http请求的错误,然后抛出一个错误,但是我面临这个错误

误差

E/颤振(18769):#13 TextInput._handleTextInputInvocation包:颤振/…/services/text_input.dart:968E/颤振(18769):#14 MethodChannel._handleAsMethodCall包:flutter/…/services/platform_channel.dart.402:402E/颤振(18769):#15 MethodChannel.setMethodCallHandler。包装:颤振/…/services/platform_channel.dart.18769:370 E/颤振(18769):#16

_DefaultBinaryMessenger.handlePlatformMessage包:颤振/…/services/binding.dart:200E/颤振(18769):#17

_invoke3。(飞镖:ui/hooks.dart:303:15)E/ _rootRun (18769):#18 _CustomZone.runGuarded (飞镖:异步/zone.dart:1126:13)E/hooks.dart (18769):#19 _CustomZone.run (飞镖:异步/zone.dart:1023:19)E/颤振(18769):#20 _CustomZone.runGuarded(飞镖:异步/左:7)E/颤振(18769):#21_invoke3 (飞镖:ui/Hooks.DAT:302:10)E/颤振(18769):#22

_dispatchPlatformMessage (飞镖:ui/Hooks.DAT:162:5)

代码语言:javascript
复制
  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;
    });
  }
代码语言:javascript
复制
     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);
      });
EN

回答 3

Stack Overflow用户

发布于 2020-01-23 08:13:53

因为您的函数类型是未来,而返回类型必须是未来,但是当您面临错误时,您的响应抛出错误并返回Null,所以最好像这样编写异步函数

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-11-13 16:58:27

请在下面加上“零”如下。在增加问题解决后,我也要面对同样的问题。

代码语言:javascript
复制
    return showDialog<Null>(
      context: context,
      builder: (ctx) => AlertDialog(
        title: Text('Error occurred!'),
        content: Text('Something went wrong...'),
        actions: [
          FlatButton(
              onPressed: () {
                Navigator.of(ctx).pop();
              },
              child: Text('Okay')),
        ],
      ),
    );
票数 1
EN

Stack Overflow用户

发布于 2020-07-12 15:44:25

之所以发生这种情况,是因为您没有指定.then((response) {})方法的返回类型,以解决这个简单的更改

代码语言:javascript
复制
 .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();
})

代码语言:javascript
复制
.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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59873712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档