// Copyright 2019 The Flutter team. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:provider_shopper/models/cart.dart'; class MyCart extends StatelessWidget { const MyCart({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Cart', style: Theme.of(context).textTheme.headline1), backgroundColor: Colors.white, ), body: Container( color: Colors.yellow, child: Column( children: [ Expanded( child: Padding( padding: const EdgeInsets.all(32), child: _CartList(), ), ), const Divider(height: 4, color: Colors.black), _CartTotal() ], ), ), ); } } class _CartList extends StatelessWidget { @override Widget build(BuildContext context) { var itemNameStyle = Theme.of(context).textTheme.headline6; // This gets the current state of CartModel and also tells Flutter // to rebuild this widget when CartModel notifies listeners (in other words, // when it changes). var cart = context.watch(); return ListView.builder( itemCount: cart.items.length, itemBuilder: (context, index) => ListTile( leading: const Icon(Icons.done), trailing: IconButton( icon: const Icon(Icons.remove_circle_outline), onPressed: () { cart.remove(cart.items[index]); }, ), title: Text( cart.items[index].name, style: itemNameStyle, ), ), ); } } class _CartTotal extends StatelessWidget { @override Widget build(BuildContext context) { var hugeStyle = Theme.of(context).textTheme.headline1!.copyWith(fontSize: 48); return SizedBox( height: 200, child: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ // Another way to listen to a model's change is to include // the Consumer widget. This widget will automatically listen // to CartModel and rerun its builder on every change. // // The important thing is that it will not rebuild // the rest of the widgets in this build method. Consumer( builder: (context, cart, child) => Text('\$${cart.totalPrice}', style: hugeStyle)), const SizedBox(width: 24), TextButton( onPressed: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Buying not supported yet.'))); }, style: TextButton.styleFrom(primary: Colors.white), child: const Text('BUY'), ), ], ), ), ); } }