Средство получения ‘price’ не определено для типа ‘String’

#flutter #flutter-layout

#flutter #flutter-layout

Вопрос:

Средство получения ‘id’ не определено для типа ‘String’.Попробуйте импортировать библиотеку, которая определяет «идентификатор», исправив имя на имя существующего средства получения или определив средство получения или поле с именем >

Я пытаюсь показать свои товары в корзине, когда добавляю их с помощью значка корзины. Когда я нажму на значок корзины, я перейду на страницу CartScrren, где мне будут показаны выбранные товары. Но я не могу получить значения из своей корзины.

 import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/cart.dart'  ;
import '../widgets/cart_items_display.dart';

class CartScreen extends StatelessWidget {
 
  static const route = '/cart';

  @override
  Widget build(BuildContext context) {
    final cart = Provider.of<Cart>(context);
    
    return Scaffold(
      appBar: AppBar(
        title: Text('Your Cart'),
      ),
      body: Column(
        children: <Widget>[
          Card(
            margin: EdgeInsets.all(25),
            child: Padding(
              padding: EdgeInsets.all(8),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Text(
                    'Total',
                    style: TextStyle(fontSize: 25),
                  ),
                  Spacer(),
                  Chip(
                    label: Text(
                      '$${cart.totalAmount}',
                      style: TextStyle(
                        color: Colors.white,
                      ),
                    ),
                    backgroundColor: Theme.of(context).primaryColor,
                  ),
                  TextButton(onPressed: () {}, child: Text('Order Now')),
                ],
              ),
            ),
          ),
          SizedBox(
            height: 10,
          ),
          Expanded(
            child: ListView.builder(
              itemCount: cart.items.length,
              itemBuilder: (ctx, i) => CartItemDisplay(
              //Having problem Here**
               cart.items.values.toString()[i].id,
               cart.items.values.toString()[i].price,
               cart.items.values.toString()[i].quantity,
                cart.items.values.toString()[i].title,
                ///////**
              ),
            ),
          ),
        ],
      ),
    );
  }
}
 

Я хочу получить значение из моей карты здесь, но показывает эту ошибку

Ниже приведена моя корзина, здесь я использую эту карту.

 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 ={} ;
  Map<String, CartItem> get items {
    return  {..._items};
  }
  int get itemCount {
    return _items.length;

  }

  double get totalAmount{
    var total=0.0;
    _items.forEach((key, cartItem) {
      total  = cartItem.price*cartItem.quantity;
    });
    

    return total;
  }

  void addItem(String productId, double price, String title) {
    if (_items.containsKey(productId)) {
      _items.update(
          productId,
          (existingCartItem) => CartItem(
              id: existingCartItem.id,
              title: existingCartItem.title,
              quantity: existingCartItem.quantity   1,
              price: existingCartItem.price));
    } else {
      _items.putIfAbsent(
          productId,
          () => CartItem(
                id: DateTime.now().toString(),
                title: title,
                quantity: 1,
                price: price,
              ));
    }
    notifyListeners();
  }
}
 

Это моя карта

Но если не использовать значения.toString() выдает эту ошибку
Это происходит, когда я этого не использую.

Ответ №1:

Пожалуйста, попробуйте получить товары корзины из значения корзины.

 final cart = Provider.of<Cart>(context);
final cartItems = cart.items.entries.map((e) => e.value).toList();

...

     Expanded(
        child: ListView.builder(
          itemCount: cartItems.length,
          itemBuilder: (ctx, i) => CartItemDisplay(
          ////* Change these lines.
           cartItems[i].id,
           cartItems[i].price,
           cartItems[i].quantity,
           cartItems[i].title,
            ///////**
          ),
        ),
      ),
...
 

Ответ №2:

Вы используете getter для получения правильности:

 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,
  });
  
  String get getId => id;
  String get getTitle => title;
  int get getQuantity => quantity;
  double get getPrice => price;
}
 

Всегда полезно использовать инкапсуляцию для возврата соответствия.

 Expanded(
  child: ListView.builder(
    itemCount: cart.items.length,
    itemBuilder: (ctx, i) => CartItemDisplay(
      //Use getter
      cart.items.values.[i].getId,
      cart.items.values.[i].getPrice,
      cart.items.values.[i].getQuantity.toString(),
      cart.items.values.[i].getTitle.toString(),
    ),
  ),
),
 

Комментарии:

1. Вы совершаете ту же ошибку, что и op. Вы должны вызывать средства получения объектов, а затем вызывать toString . Также title и id не нужно преобразовывать в строку.

2. сэр, он показывает то же самое, что и раньше: «getId ‘getId’ не определен для типа ‘String’. Попробуйте импортировать библиотеку, которая определяет ‘getId’, исправив имя на имя существующего средства получения или определив средство получения или поле с именем ‘getId»‘

3. @Md.FazleRabbiI Извините, я забыл удалить toString () .

4. @EliaTolin Действительно, я делаю.

Ответ №3:

Вы можете использовать этот сайт для создания классов моделей https://javiercbk.github.io/json_to_dart / я думаю, что этот сайт полезен для создания вашего класса модели, вы можете поместить свой json на этот сайт и получить класс модели