-
-
Save boeledi/c6e009e77e964b699aea2a43269f633b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ShoppingItemWidget extends StatefulWidget { | |
ShoppingItemWidget({ | |
super.key, | |
required this.shoppingItem, | |
}); | |
final ShoppingItem shoppingItem; | |
@override | |
_ShoppingItemWidgetState createState() => _ShoppingItemWidgetState(); | |
} | |
class _ShoppingItemWidgetState extends State<ShoppingItemWidget> { | |
StreamSubscription? _subscription; | |
final ShoppingItemBloc _bloc; | |
final ShoppingBloc _shoppingBloc; | |
@override | |
void didChangeDependencies() { | |
super.didChangeDependencies(); | |
// As the context should not be used in the "initState()" method, | |
// prefer using the "didChangeDependencies()" when you need | |
// to refer to the context at initialization time | |
_initBloc(); | |
} | |
@override | |
void didUpdateWidget(ShoppingItemWidget oldWidget) { | |
super.didUpdateWidget(oldWidget); | |
// as Flutter might decide to reorganize the Widgets tree | |
// it is preferable to recreate the links | |
_disposeBloc(); | |
_initBloc(); | |
} | |
@override | |
void dispose() { | |
_disposeBloc(); | |
super.dispose(); | |
} | |
// This routine is reponsible for creating the links | |
void _initBloc() { | |
// Create an instance of the ShoppingItemBloc | |
_bloc = ShoppingItemBloc(widget.shoppingItem); | |
// Retrieve the BLoC that handles the Shopping Basket content | |
_shoppingBloc = BlocProvider.of<ShoppingBloc>(context); | |
// Simple pipe that transfers the content of the shopping | |
// basket to the ShoppingItemBloc | |
_subscription = _shoppingBloc.shoppingBasket.listen(_bloc.shoppingBasket); | |
} | |
void _disposeBloc() { | |
_subscription?.cancel(); | |
_bloc.dispose(); | |
} | |
Widget _buildButton() { | |
return StreamBuilder<bool>( | |
stream: _bloc.isInShoppingBasket, | |
initialData: false, | |
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) { | |
return snapshot.data | |
? _buildRemoveFromShoppingBasket() | |
: _buildAddToShoppingBasket(); | |
}, | |
); | |
} | |
Widget _buildAddToShoppingBasket(){ | |
return ElevatedButton( | |
child: Text('Add...'), | |
onPressed: (){ | |
_shoppingBloc.addToShoppingBasket(widget.shoppingItem); | |
}, | |
); | |
} | |
Widget _buildRemoveFromShoppingBasket(){ | |
return ElevatedButton( | |
child: Text('Remove...'), | |
onPressed: (){ | |
_shoppingBloc.removeFromShoppingBasket(widget.shoppingItem); | |
}, | |
); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return Card( | |
child: GridTile( | |
header: Center( | |
child: Text(widget.shoppingItem.title), | |
), | |
footer: Center( | |
child: Text('${widget.shoppingItem.price} €'), | |
), | |
child: Container( | |
color: widget.shoppingItem.color, | |
child: Center( | |
child: _buildButton(), | |
), | |
), | |
), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment