我在颤动中的捕获错误没有按我想要的那样工作。我想在出现错误但未显示时显示错误消息

Posted

技术标签:

【中文标题】我在颤动中的捕获错误没有按我想要的那样工作。我想在出现错误但未显示时显示错误消息【英文标题】:My catch error in flutter is not working as I want it to. I want to display error message when the error appears but it is not showing up 【发布时间】:2022-01-15 11:56:14 【问题描述】:

我在 addproduct 对象中添加了 catch 错误,并将它添加到我的屏幕中,以便我可以看到错误消息。所以我故意犯了一个错误,在解析时从我的firebase服务器中删除'.json',因此它没有保存并给出错误enter image description here 这是错误:

但不知何故,错误消息并未在应用程序上向用户显示。

产品代码(添加产品对象):

class Products with ChangeNotifier 
  List<Product> _items = [
    Product(
      id: 'p1',
      title: 'Red Shirt',
      description: 'A red shirt - it is pretty red!',
      price: 29.99,
      imageUrl:
          'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
    ),
    Product(
      id: 'p2',
      title: 'Trousers',
      description: 'A nice pair of trousers.',
      price: 59.99,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px-Trousers%2C_dress_%28AM_1960.022-8%29.jpg',
    ),
    Product(
      id: 'p3',
      title: 'Yellow Scarf',
      description: 'Warm and cozy - exactly what you need for the winter.',
      price: 19.99,
      imageUrl:
          'https://live.staticflickr.com/4043/4438260868_cc79b3369d_z.jpg',
    ),
    Product(
      id: 'p4',
      title: 'A Pan',
      description: 'Prepare any meal you want.',
      price: 49.99,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Cast-Iron-Pan.jpg/1024px-Cast-Iron-Pan.jpg',
    ),
  ];

  

  List<Product> get items 
    
    return [..._items];
  

  

  
  Product findById(String id) 
    return _items.firstWhere((element) => element.id == id);
  

  Future<void> addProduct(Product product) 
    var url = Uri.parse(
        'Server link without .json');
    
   return http
        .post(
      url,
      body: json.encode(
        'title': product.title,
        'description': product.description,
        'imageUrl': product.imageUrl,
        'price': product.price,
        'Favorite': product.isFavourite
      ),
    )
        .then((response) 
     
      print(jsonDecode(response.body));
      final newProduct = Product(
          description: product.description,
          id: jsonDecode(response.body)['name'],
          imageUrl: product.imageUrl,
          price: product.price,
          title: product.title);
      _items.add(newProduct);
     
      notifyListeners();
    ).catchError((error) 
      
      print(error);
      throw error;
    ); 
  

  void updateProduct(String id, Product newProduct) 
    final prodIndex = _items.indexWhere((prod) => prod.id == id);
    if (prodIndex >= 0) 
      _items[prodIndex] =
          newProduct; 
      notifyListeners();
     else 
      print('...');
    
  

 

编辑产品屏保对象代码:

void _saveForm() 
    final isValid =
        _form.currentState!.validate(); 
    if (!isValid) 
      return;
    
    _form.currentState!.save(); 
    setState(() 
      _isLoading = true;
    );
    if (_editedProduct.id != '') 
      Provider.of<Products>(context, listen: false)
          .updateProduct(_editedProduct.id, _editedProduct);
      setState(() 
        _isLoading = false;
      );
      Navigator.of(context).pop();
     else 
      Provider.of<Products>(context, listen: false)
          .addProduct(_editedProduct)
          .catchError((error) 
       
        return showDialog(
            context: context,
            builder: (ctx) => AlertDialog(
                  title: Text('An error Occured'),
                  content: Text('Something went wrong'),
                  actions: [
                    ElevatedButton(
                        onPressed: () 
                          Navigator.of(ctx).pop();
                        ,
                        child: Text('Okay'))
                  ],
                ));
      ).then((_) 
        setState(() 
          _isLoading = false;
        );
        
        Navigator.of(context).pop();
      );
     

    
  

提前致谢!!!

【问题讨论】:

【参考方案1】:

我认为如果你不返回 showDialog 问题就会解决

.catchError((error) 
   
    showDialog(
        context: context,
        builder: (ctx) => AlertDialog(
              title: Text('An error Occured'),
              content: Text('Something went wrong'),
              actions: [
                ElevatedButton(
                    onPressed: () 
                      Navigator.of(ctx).pop();
                    ,
                    child: Text('Okay'))
              ],
            ));
  )

【讨论】:

您好,感谢您的帮助。警报对话框仍未出现,只是 Navigator.of(context).pop 已停止工作。 试试这个。使函数异步并将等待放在 showDialog 后面

以上是关于我在颤动中的捕获错误没有按我想要的那样工作。我想在出现错误但未显示时显示错误消息的主要内容,如果未能解决你的问题,请参考以下文章

小部件中的图像 [颤动]

我想在颤动中用手电筒录制视频,任何人都知道颤动中的任何插件或方法

将颤动的 PageView 与屏幕左侧对齐

ComboBox DataSource 没有按我预期的那样工作[重复]

颤动的firebase推送通知图标

php require_once 没有按我想要的方式工作.. 相对路径问题