#flutter #dart #dart-null-safety
Вопрос:
Соответствующий код
import 'package:flutter/foundation.dart';
class CartItem {
final String id;
final String title;
final int quantity;
final double price;
CartItem({
required this.id,
required this.title,
required this.quantity,
required this.price,
});
}
class Cart with ChangeNotifier {
Map<String, CartItem> _items = {}; // see that I have initialized the items
Код, в котором я получаю нулевую ошибку безопасности «Свойство » количество», не может быть безоговорочно доступен, потому что получатель может быть «нулевым».
Попробуйте сделать доступ условным (используя»?.») или добавить нулевую проверку к цели («!»).’ Ошибка, которую я получаю, связана с приведенной ниже переменной количества. Я не знаю, как это исправить. Я смотрел видео, в которых говорилось о int?, ! и ?: операторы, но этот конкретный сценарий не был рассмотрен.
if (_items[productID].quantity == 1) _items.remove(productID);
Дополнительные вопросы, что здесь является получателем, на который указывает ошибка, которая может быть нулевой?
Ответ №1:
Это происходит потому, что вы пытаетесь получить доступ к действительному на карте, передав ему ключ. Если идентификатор существует в качестве ключа на карте, то у вас действительно будет объект cartitem. Но если идентификатор не существует, результат будет равен нулю, и ваша операция станет null.quantity
.
Получатель здесь-ваш объект cartitem.
Попробуй:
_items[productID]!.quantity
Таким образом, вы обещаете дарту, что невозможно быть нулевым. Ваша ошибка исчезнет, но это рискованная операция. Правильный способ исправить это-убедиться, что он не равен нулю, прежде чем вызывать количество на нем.
Перед вашим заявлением «если» сделайте это:
if (_items[productID] != null) if(_items[productID]!.quantity == 1) _items.remove(productID);
Таким образом, вы наверняка не попадете в свой второй оператор if, если только cartitem не будет равен нулю на 100%.
Комментарии:
1. Как вы можете видеть в приведенном выше коде, я сделал их
required
, кроме того, если я попробую quanity = 0 в конструкторе, я получу ошибку. Не знаю, что делать2. Моя вина, я отредактировал свой ответ.