diff --git a/lib/app.dart b/lib/app.dart index 62b0ce4..5235705 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:thesis_shop/route_key.dart'; +import 'package:thesis_shop/screens/cart/cart_screen.dart'; import 'package:thesis_shop/screens/product_list/product_list_screen.dart'; +import 'package:thesis_shop/utils/map_keys_extension.dart'; class ThesisShopApp extends StatelessWidget { const ThesisShopApp({Key? key}) : super(key: key); @@ -13,7 +16,11 @@ class ThesisShopApp extends StatelessWidget { primarySwatch: Colors.red, brightness: Brightness.dark, ), - home: const ProductListScreen(), + routes: { + RouteKey.products: (context) => const ProductListScreen(), + RouteKey.cart: (context) => const CartScreen(), + }.mapKeys((key) => key.name), + initialRoute: 'products', ); } } diff --git a/lib/route_key.dart b/lib/route_key.dart new file mode 100644 index 0000000..d894747 --- /dev/null +++ b/lib/route_key.dart @@ -0,0 +1,7 @@ +import 'package:flutter/widgets.dart'; + +enum RouteKey { products, cart } + +extension NavigatorHelper on NavigatorState { + pushRouteKey(RouteKey key) => pushNamed(key.name); +} diff --git a/lib/screens/cart/cart_screen.dart b/lib/screens/cart/cart_screen.dart new file mode 100644 index 0000000..517dfec --- /dev/null +++ b/lib/screens/cart/cart_screen.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class CartScreen extends StatelessWidget { + const CartScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Warenkorb')), + ); + } +} diff --git a/lib/screens/product_list/cart_button.dart b/lib/screens/product_list/cart_button.dart new file mode 100644 index 0000000..6e8bfdd --- /dev/null +++ b/lib/screens/product_list/cart_button.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:thesis_shop/route_key.dart'; + +class CartButton extends StatelessWidget { + const CartButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ElevatedButton.icon( + onPressed: () => Navigator.of(context).pushRouteKey(RouteKey.cart), + icon: const Icon(Icons.shopping_basket), + label: const Text('Warenkorb (2 Produkte)'), + ); + } +} diff --git a/lib/screens/product_list/cart_button_overlay.dart b/lib/screens/product_list/cart_button_overlay.dart new file mode 100644 index 0000000..250138f --- /dev/null +++ b/lib/screens/product_list/cart_button_overlay.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +import 'cart_button.dart'; + +class CartButtonOverlay extends StatelessWidget { + final Widget child; + const CartButtonOverlay({Key? key, required this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Positioned.fill(child: child), + const Positioned( + left: 8, + bottom: 8, + right: 8, + child: SafeArea(child: CartButton()), + ) + ], + ); + } +} diff --git a/lib/screens/product_list/product_list.dart b/lib/screens/product_list/product_list.dart new file mode 100644 index 0000000..41b8d33 --- /dev/null +++ b/lib/screens/product_list/product_list.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:thesis_shop/models/product.dart'; + +import 'product_item.dart'; + +class ProductList extends StatelessWidget { + final List products; + const ProductList({Key? key, required this.products}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ListView.separated( + itemCount: products.length, + itemBuilder: (context, index) => ProductItem(product: products[index]), + separatorBuilder: (context, _) => const Divider(), + ); + } +} diff --git a/lib/screens/product_list/product_list_screen.dart b/lib/screens/product_list/product_list_screen.dart index 9258fa3..57dd1d1 100644 --- a/lib/screens/product_list/product_list_screen.dart +++ b/lib/screens/product_list/product_list_screen.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:thesis_shop/models/product.dart'; -import 'package:thesis_shop/screens/product_list/product_item.dart'; + +import 'cart_button_overlay.dart'; +import 'product_list.dart'; const _productPlaceholder = [ Product(title: 'Bananen', price: 3), @@ -17,10 +19,8 @@ class ProductListScreen extends StatelessWidget { const products = _productPlaceholder; return Scaffold( appBar: AppBar(title: const Text('Thesis Shop')), - body: ListView.separated( - itemCount: products.length, - itemBuilder: (context, index) => ProductItem(product: products[index]), - separatorBuilder: (context, _) => const Divider(), + body: const CartButtonOverlay( + child: ProductList(products: _productPlaceholder), ), ); } diff --git a/lib/utils/map_keys_extension.dart b/lib/utils/map_keys_extension.dart new file mode 100644 index 0000000..d5ffae9 --- /dev/null +++ b/lib/utils/map_keys_extension.dart @@ -0,0 +1,6 @@ +typedef MapFunction = T Function(K key); + +extension MapKeysExtension on Map { + Map mapKeys(MapFunction keyMapper) => + map((key, value) => MapEntry(keyMapper(key), value)); +}