You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Dart商城应用添加产品功能异常问题求助

商城应用添加产品崩溃/无响应问题修复

核心问题分析

  1. ID判断逻辑错误
    Product类的id是final String类型,你初始化新产品时给的是id: ''(空字符串),但_saveForm方法里用if (_editedProduct.id != null)判断是否为更新操作——空字符串不等于null,导致添加新产品时错误进入更新分支,产品根本没被添加,出现无响应。

  2. Provider监听模式错误
    调用addProduct时用了listen: true,但listen: true要求必须在组件的build方法内使用,在_saveForm这种回调里调用会触发Flutter框架的断言错误,直接导致应用崩溃。


修复代码

1. 修正_saveForm方法

void _saveForm() {
  final isValid = _form.currentState!.validate();
  if (!isValid) {
    return;
  }
  _form.currentState!.save();
  
  // 改为判断id是否非空字符串
  if (_editedProduct.id.isNotEmpty) {
    Provider.of<ProductsProvider>(context, listen: false)
        .updateProduct(_editedProduct.id, _editedProduct);
  } else {
    // 添加操作改用listen: false
    Provider.of<ProductsProvider>(context, listen: false)
        .addProduct(_editedProduct);
  }
  Navigator.of(context).pop();
}

2. (可选)优化ID类型判断

如果想让逻辑更直观,可以修改Product类的id为可空类型:

class Product with ChangeNotifier {
  final String? id; // 改为可空
  final String title;
  final String description;
  final int price;
  final String imageUrl;
  bool isFav;

  Product({
    this.id, // 移除required
    required this.title,
    required this.description,
    required this.price,
    required this.imageUrl,
    this.isFav = false,
  });

  void toggleFavStatus() {
    isFav = !isFav;
    notifyListeners();
  }
}

然后初始化新产品时设为id: null:

var _editedProduct = Product(
  id: null,
  title: '',
  price: 0,
  description: '',
  imageUrl: '',
);

此时_saveForm里的判断可以保留if (_editedProduct.id != null),逻辑更清晰。


额外建议

快速连续添加产品时,DateTime.now().toString()可能生成重复ID(极端情况),可以引入uuid包生成唯一ID,避免后续出现产品覆盖或查找错误。

内容的提问来源于stack exchange,提问作者RIZWAN ALI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:30:51