Я использовал пакет провайдера для корзины, а свойство length не установлено. Ошибка продолжает появляться - PullRequest
0 голосов
/ 31 марта 2020

Я использую флаттер для создания корзины покупок, и когда я реализовал ChangeNotifierProvider в root приложения. Но при запуске эта ошибка продолжает появляться

I/flutter ( 8082): The following NoSuchMethodError was thrown building HomeScreen(dirty, dependencies:
I/flutter ( 8082): [InheritedProvider<CartState>], state: _HomeScreenState#10643):
I/flutter ( 8082): The getter 'length' was called on null.
I/flutter ( 8082): Receiver: null
I/flutter ( 8082): Tried calling: length
I/flutter ( 8082):
I/flutter ( 8082): The relevant error-causing widget was:
I/flutter ( 8082):   HomeScreen file:///C:/Users/Owner/FlutterProjects/an/appfrontend/lib/main.dart:92:17

Я знаю, что не предоставил много информации. Это очевидно из-за того, что свойство при запуске имеет значение null, но как я могу решить это при запуске. Вот код провайдера. Пока вы работаете, я был бы очень признателен, если бы вы указали на логическую ошибку в методе buildProduct. Я не чувствовал себя хорошо, пока писал это :). Спасибо, любая помощь будет оценена.

class CartState extends ChangeNotifier {
  List<CartItem> _cartItems;
  List<CartItem> get cartItems => _cartItems;

  void buildProduct(Product product, {int quantity = 1}) {
    for (int i = 0; i < _cartItems.length; i++) {
      if (_cartItems[i].product.id == product.id) {
        if (_cartItems.length > 1) {
          String id = _cartItems[i].product.merchantId;
          if (product.merchantId == id)
            _cartItems[i].quantity += quantity;
          else
            throw Exception(
              "Cannot place two orders from separate Restaurants in one go. Please Place a separate order.",
            );
        }
      }
    }

    CartItem newItem = CartItem(product, quantity);

    _cartItems.add(newItem);

    notifyListeners();
  }
}

Код, который я использовал в файле main.dart:

Widget build(BuildContext context) {
return GraphQLProvider(
  client: client,
  child: ChangeNotifierProvider<CartState>(
    create: (_) => CartState(),
    lazy: true,

    child: CacheProvider(
      child: ChangeNotifierProvider<AppState>(
        create: (_) => AppState(),
        child: MaterialAppWidget(auth: auth),
      ),
    ),
  ),
);

}

...