Изменение значения внутри конструктора представления списка с помощью поставщика

#flutter #shopping-cart #provider

#flutter #корзина покупок #поставщик

Вопрос:

У меня есть приложение для покупок, которое хочет создать список пожеланий, я многое сделал правильно, просто когда я хочу проверить один продукт, все продукты проверены, а также когда я хочу увеличить или уменьшить количество продукта, все продукты меняются, как показано на рисунке ниже, мой код :

Поставщик :

 class ProductProvider with ChangeNotifier {
  List<Product> products = [];
  bool isAdded = false;
  int count = 0;
  void chane_add_color() {
    isAdded = !isAdded;
    notifyListeners();
  }

  void add_count() {
    count  ;

    notifyListeners();
  }

  void rem_count() {
    if (count > 0) {
      count--;
    }
    notifyListeners();
  }
}
 

моя плитка списка осталась в конце :

 trailing: Consumer<ProductProvider>(
                        builder: (context, prod, child) {
                      return Wrap(
                        spacing: 35,
                        children: <Widget>[
                          Column(
                            children: [
                              InkWell(
                                  onTap: prod.add_count,
                                  child: Icon(Icons.add, color: Colors.green)),
                              Text('${prod.count}'),
                              InkWell(
                                  onTap: prod.rem_count,
                                  child: Icon(Icons.remove, color: Colors.red)),
                            ],
                          ),
                          IconButton(
                            onPressed: prod.chane_add_color,
                            icon: Icon(Icons.favorite,
                                color: prod.isAdded ? Colors.red : Colors.grey),
                          ),
                        ],
                      );
                    }),
 

результат :

введите описание изображения здесь

Я предполагаю, что для этого нужен список для счетчика, но не знаю, как это сделать

есть ли какие-либо предложения?

Ответ №1:

Это класс notifier:

 class ProductModel extends ChangeNotifier {
   List<Map<String, dynamic>> _products = [
    {'product': 'mercedes', 'count': 0, 'isFavorite': false},
    {'product': 'audi', 'count': 0, 'isFavorite': false},
    {'product': 'bmw', 'count': 0, 'isFavorite': false},
    {'product': 'volvo', 'count': 0, 'isFavorite': false}
  ];
  List<Map<String, dynamic>> get products => _products;
  
  ProductModel();
  ProductModel.instance();
  
  addFavorite({int index}) {
    _products[index]['isFavorite'] = !_products[index]['isFavorite'];
    notifyListeners();
  }

  incrementCounter({int index}) {
    _products[index]['count']  = 1;
    notifyListeners();
  }
}
 

Это ваш виджет:

 class ProductView extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

   return Scaffold(
      body: ChangeNotifierProvider<ProductModel>(
        create: (context) => ProductModel.instance(),
        child: Consumer<ProductModel>(
          builder: (context, viewModel, child) {
            return ListView.builder(
              itemCount: viewModel.products.length,
              itemBuilder: (context, index) {
                return ListTile(
                  leading: FlatButton(
                    child: Text('${viewModel.products[index]['count']}  '),
                    onPressed: () {
                      viewModel.incrementCounter(index: index);
                    },
                  ),
                  title: Text(viewModel.products[index]['product']),
                  trailing: IconButton(
                    icon: Icon(
                      Icons.favorite,
                      color: viewModel.products[index]['isFavorite']
                          ? Colors.red
                          : Colors.grey,
                    ),
                    onPressed: () {
                      viewModel.addFavorite(index: index);
                    },
                  ),
                );
              },
            );
          },
        ),
      ),
    );
  }
}