У меня возникли проблемы с API edamam при проверке значений, которые могут не существовать. При запросе пищевой ценности чего-то вроде «одной пиццы» ошибок нет, и данные возвращаются успешно, но это не относится к большинству запросов, например «одна тарелка супа».
У меня есть будущий построитель, который обновляется, когда пользователь отправляет свой запрос в текстовое поле после нажатия кнопки.
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData &&
!snapshot.hasError &&
snapshot.data != null) {
energy = snapshot.data['totalDaily']['ENERC_KCAL']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['ENERC_KCAL']['quantity'];
fat = snapshot.data['totalDaily']['FAT']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['FAT']['quantity'];
protein = snapshot.data['totalDaily']['PROCNT']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['PROCNT']['quantity'];
cholesterol = snapshot.data['totalDaily']['CHOLE']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['CHOLE']['quantity'];
Переменные получают информацию, и в зависимости от проверки if я возвращаю загрузчик или информацию. Я думал, что добавление нулевой проверки предотвратит любые ошибки, но, похоже, они ничего не делают. Это ошибка, которую я получаю
The following NoSuchMethodError was thrown building FutureBuilder<dynamic>(dirty, state: _FutureBuilderState<dynamic>#3bbe5):
The method '[]' was called on null.
Receiver: null
Tried calling: []("quantity")
Есть лучший способ сделать это? а что я тут не так делаю?
Ваша проблема в том, что вы делаете x['quantity']
там, где x
находится null
. Ваши текущие нулевые проверки проверяют, что такие вещи, как snapshot.data['totalDaily']['ENERC_KCAL']['quantity']
, не являются нулевыми, но это слишком поздно; они пренебрегают проверкой того, что snapshot.data['totalDaily']['ENERC_KCAL']
и т. д. не равны нулю. Если у вас включены функции нулевой безопасности, вы можете проверить snapshot.data['totalDaily']?['ENERC_KCAL']?['quantity'] == null
.
Итак, я попробовал это, как вы сказали, jamesdlin, и проблема исправлена, большое спасибо, но это довольно многословно. Как включить функции нулевой безопасности, чтобы они были упрощены, как вы написали?
@NanaKwame Пожалуйста, проверьте мой ответ, чтобы найти менее многословное решение.
Включение нулевой безопасности может потребовать больше работы, чем вы готовы сделать прямо сейчас. А пока вы можете использовать package:basics и использовать snapshot.data.get('totalDaily')?.get('ENERC_KCAL')?.get('quantity') == null
.
Прежде всего, чтобы избежать большинства ошибок и проблем с обработкой данных, я рекомендую использовать объект для представления вашей информации о еде. Вы можете использовать этот инструмент, выбрать Dart в качестве языка, а затем вставить данные JSON. Теперь у вас есть эти объекты:
class Food {
Food({
this.totalDaily,
});
TotalDaily totalDaily;
factory Food.fromJson(Map<String, dynamic> json) => Food(
totalDaily: TotalDaily.fromJson(json["totalDaily"]),
);
// I omit the toJson() method since it's not used in this question
}
class TotalDaily {
TotalDaily({
this.enercKcal,
this.fat,
this.procnt,
this.chole,
});
NutritionValue enercKcal;
NutritionValue fat;
NutritionValue procnt;
NutritionValue chole;
factory TotalDaily.fromJson(Map<String, dynamic> json) => TotalDaily(
enercKcal: NutritionValue.fromJson(json["ENERC_KCAL"]),
fat: NutritionValue.fromJson(json["FAT"]),
procnt: NutritionValue.fromJson(json["PROCNT"]),
chole: NutritionValue.fromJson(json["CHOLE"]),
);
}
class NutritionValue {
NutritionValue({
this.quantity,
});
int quantity;
factory NutritionValue.fromJson(Map<String, dynamic> json) => NutritionValue(
quantity: json["quantity"],
);
}
Тогда все, что вам нужно сделать, это:
Food food = Food.fromJson(snapshot.data)
Пробовал звонить:
Что касается этой проблемы, похоже, что ошибка может быть связана со всем синтаксическим анализом энергии, жира, белка или холестерина, который использует свойство quantity
. В этом случае вы можете сделать простую проверку следующим образом:
// Example for FAT checking
fat = food.totalDaily.fat?.quantity ?? 0.0
Я не знал, что есть автоматизированный способ сделать это, кратко. Большое спасибо.
Можете ли вы предоставить свой журнал ошибок?