Arrays 如何编辑列表中自定义模型的属性(颤振/省道)?

Arrays 如何编辑列表中自定义模型的属性(颤振/省道)?,arrays,list,flutter,dart,Arrays,List,Flutter,Dart,我在flutter应用程序中有这个日志食物功能。有两种添加食物的方法(1)是添加到列表中,这相当简单,因为我所要做的就是listName.add(ModelName(properties:value));然而,(2)方法是编辑初始列表的索引,如下所示: import 'package:thesis/foodAPICalls/food.dart'; class MealsListData { int id; String imagePath; String titleTxt; S

我在flutter应用程序中有这个日志食物功能。有两种添加食物的方法(1)是添加到列表中,这相当简单,因为我所要做的就是listName.add(ModelName(properties:value));然而,(2)方法是编辑初始列表的索引,如下所示:

import 'package:thesis/foodAPICalls/food.dart';

class MealsListData {
  int id;
  String imagePath;
  String titleTxt;
  String startColor;
  String endColor;
  DateTime date;
  Nutritionix nutritionix;
  String meals;
  double totalCalories;

  MealsListData({
    this.id,
    this.imagePath = '',
    this.titleTxt = '',
    this.startColor = "",
    this.endColor = "",
    this.date,
    this.nutritionix,
    this.meals,
    this.totalCalories = 0,
  });

  static List<MealsListData> mealEntry = [
     MealsListData(
      id: 1,
      imagePath: 'assets/fitness_app/breakfast.png',
      titleTxt: 'Breakfast',
      totalCalories:  0,
      meals: '',
      date: DateTime.now(),
      startColor: "#FA7D82",
      endColor: "#FFB295",
    ),
    MealsListData(
      id: 2,
      imagePath: 'assets/fitness_app/lunch.png',
      titleTxt: 'Lunch',
      totalCalories: 0,
      meals: '',
      date: DateTime.now(),
      startColor: "#738AE6",
      endColor: "#5C5EDD",
    ),
    MealsListData(
      id: 3,
      imagePath: 'assets/fitness_app/snack.png',
      titleTxt: 'Snack',
      totalCalories: 0,
      meals: 'Recommend: 800 kcal',
      startColor: "#FE95B6",
      endColor: "#FF5287",
    ),
    MealsListData(
      id: 4,
      imagePath: 'assets/fitness_app/dinner.png',
      titleTxt: 'Dinner',
      totalCalories: 0,
      meals: 'Recommend: 703 kcal',
      startColor: "#6F72CA",
      endColor: "#1E1466",
    ),

  ];
}

在添加食物屏幕内,我创建了一个冗长的嵌套if-else,以检查用户是否尝试使用方式1或方式2添加食物

 void _submitData() {
  List<MealsListData> mealEntry = MealsListData.mealEntry;
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      double totalCalories = 0;
      print(nutritionix.food.length);
      for (int i = 0; i < nutritionix.food.length; i++) {
        totalCalories = nutritionix.food[i].calories + totalCalories;
      }
      print(totalCalories);

      if (idcount == null) { // WAY 1 (adding to initial List)
        switch (_foodTypeInput) {
          case 'Breakfast':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/breakfast.png',
                titleTxt: _foodTypeInput,
                totalCalories: totalCalories,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#FA7D82",
                endColor: "#FFB295",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Lunch':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/lunch.png',
                titleTxt: _foodTypeInput,
                totalCalories: 590,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#738AE6",
                endColor: "#5C5EDD",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Snack':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/snack.png',
                titleTxt: _foodTypeInput,
                totalCalories: 200,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#FE95B6",
                endColor: "#FF5287",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Dinner':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/dinner.png',
                titleTxt: _foodTypeInput,
                totalCalories: 600,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#6F72CA",
                endColor: "#1E1466",
              ));
              Navigator.pop(context);
            }
            break;
        }
      } else{ // WAY 2 editing index based on id
        var newEntry = mealEntry.firstWhere((id) => id.id == idcount, orElse: null );
        if(newEntry!=null){
        newEntry.totalCalories = totalCalories;
        newEntry.meals= _food;
        newEntry.nutritionix= nutritionix;
        Navigator.pop(context);
        } else{}

      }

      print(mealEntry);
      print(_foodTypeInput);
      print(_food);
      print(_selectedDate);
    }
  }
void\u submitData(){
List mealEntry=MealsListData.mealEntry;
if(_formKey.currentState.validate()){
_formKey.currentState.save();
两倍总热量=0;
印刷品(营养品、食品、长度);
对于(int i=0;iid.id==idcount,orElse:null);
if(newEntry!=null){
newEntry.totalcarries=总卡路里;
新条目。膳食=食物;
newEntry.nutritionix=nutritionix;
Navigator.pop(上下文);
}else{}
}
印刷(测量);
打印(食物类型输入);
印刷品;
打印(_selectedDate);
}
}

对于方法2:我所做的是为我的自定义模型创建firstWhere,但是我不断得到这个错误“Bad state:No element”我如何解决这个问题?感谢您阅读我的长篇文章。我感谢您的帮助!

Woops,原来我没有使用传递给小部件的数据。我应该使用Widget.idcount而不仅仅是idcount

 void _submitData() {
  List<MealsListData> mealEntry = MealsListData.mealEntry;
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      double totalCalories = 0;
      print(nutritionix.food.length);
      for (int i = 0; i < nutritionix.food.length; i++) {
        totalCalories = nutritionix.food[i].calories + totalCalories;
      }
      print(totalCalories);

      if (idcount == null) { // WAY 1 (adding to initial List)
        switch (_foodTypeInput) {
          case 'Breakfast':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/breakfast.png',
                titleTxt: _foodTypeInput,
                totalCalories: totalCalories,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#FA7D82",
                endColor: "#FFB295",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Lunch':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/lunch.png',
                titleTxt: _foodTypeInput,
                totalCalories: 590,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#738AE6",
                endColor: "#5C5EDD",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Snack':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/snack.png',
                titleTxt: _foodTypeInput,
                totalCalories: 200,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#FE95B6",
                endColor: "#FF5287",
              ));
              Navigator.pop(context);
            }
            break;

          case 'Dinner':
            {
              mealEntry.add(MealsListData(
                id: idcount++,
                imagePath: 'assets/fitness_app/dinner.png',
                titleTxt: _foodTypeInput,
                totalCalories: 600,
                meals: _food,
                date: _selectedDate,
                nutritionix: nutritionix,
                startColor: "#6F72CA",
                endColor: "#1E1466",
              ));
              Navigator.pop(context);
            }
            break;
        }
      } else{ // WAY 2 editing index based on id
        var newEntry = mealEntry.firstWhere((id) => id.id == idcount, orElse: null );
        if(newEntry!=null){
        newEntry.totalCalories = totalCalories;
        newEntry.meals= _food;
        newEntry.nutritionix= nutritionix;
        Navigator.pop(context);
        } else{}

      }

      print(mealEntry);
      print(_foodTypeInput);
      print(_food);
      print(_selectedDate);
    }
  }