feat: remove listenablebuilders from order details

This commit is contained in:
mike doornenbal 2024-07-09 10:09:24 +02:00
parent 1b307e3084
commit 2bf42c4acb
4 changed files with 104 additions and 115 deletions

View file

@ -49,7 +49,9 @@ class _OrderDetailScreenState extends State<OrderDetailScreen> {
checkingPages: checkingPages, checkingPages: checkingPages,
), ),
pages: widget.configuration.pages?.call(context) ?? pages: widget.configuration.pages?.call(context) ??
defaultPages(context), defaultPages(context, () {
setState(() {});
}),
onFinished: (data) async { onFinished: (data) async {
widget.configuration.onStepsCompleted.call( widget.configuration.onStepsCompleted.call(
widget.configuration.shoppingService.shopService.selectedShop!.id, widget.configuration.shoppingService.shopService.selectedShop!.id,

View file

@ -2,9 +2,11 @@ import "package:animated_toggle/animated_toggle.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_order_details/flutter_order_details.dart"; import "package:flutter_order_details/flutter_order_details.dart";
/// Default pages for the order details screen. /// Default pages for the order details screen.
List<FlutterFormPage> defaultPages(BuildContext context) { List<FlutterFormPage> defaultPages(
BuildContext context,
Function() onSwitched,
) {
var theme = Theme.of(context); var theme = Theme.of(context);
var morningTimes = <String>[ var morningTimes = <String>[
@ -307,30 +309,25 @@ List<FlutterFormPage> defaultPages(BuildContext context) {
toggleColor: theme.colorScheme.primary, toggleColor: theme.colorScheme.primary,
onSwitch: (value) { onSwitch: (value) {
switchStatus.value = value; switchStatus.value = value;
onSwitched();
}, },
childLeft: Center( childLeft: Center(
child: ListenableBuilder( child: Text(
listenable: switchStatus, "Morning",
builder: (context, widget) => Text( style: theme.textTheme.titleSmall?.copyWith(
"Morning", color: switchStatus.value
style: theme.textTheme.titleSmall?.copyWith( ? theme.colorScheme.primary
color: switchStatus.value : Colors.white,
? theme.colorScheme.primary
: Colors.white,
),
), ),
), ),
), ),
childRight: Center( childRight: Center(
child: ListenableBuilder( child: Text(
listenable: switchStatus, "Afternoon",
builder: (context, widget) => Text( style: theme.textTheme.titleSmall?.copyWith(
"Afternoon", color: switchStatus.value
style: theme.textTheme.titleSmall?.copyWith( ? Colors.white
color: switchStatus.value : theme.colorScheme.primary,
? Colors.white
: theme.colorScheme.primary,
),
), ),
), ),
), ),
@ -339,35 +336,31 @@ List<FlutterFormPage> defaultPages(BuildContext context) {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ListenableBuilder( FlutterFormInputMultipleChoice(
listenable: switchStatus, validationMessage: "Select a Time",
builder: (context, widget) => FlutterFormInputMultipleChoice( controller: multipleChoiceController,
validationMessage: "Select a Time", options: switchStatus.value ? afternoonTimes : morningTimes,
controller: multipleChoiceController, mainAxisSpacing: 5,
options: switchStatus.value ? afternoonTimes : morningTimes, crossAxisSpacing: 5,
mainAxisSpacing: 5, childAspectRatio: 2,
crossAxisSpacing: 5, height: MediaQuery.of(context).size.height * 0.6,
childAspectRatio: 2, builder: (context, index, selected, controller, options, state) =>
height: MediaQuery.of(context).size.height * 0.6, GestureDetector(
builder: onTap: () {
(context, index, selected, controller, options, state) => state.didChange(options[index]);
GestureDetector( selected.value = index;
onTap: () { controller.onSaved(options[index]);
state.didChange(options[index]); },
selected.value = index; child: Container(
controller.onSaved(options[index]); decoration: BoxDecoration(
}, color: selected.value == index
child: Container( ? Theme.of(context).colorScheme.primary
decoration: BoxDecoration( : Colors.white,
color: selected.value == index borderRadius: BorderRadius.circular(10),
? Theme.of(context).colorScheme.primary ),
: Colors.white, height: 40,
borderRadius: BorderRadius.circular(10), child: Center(
), child: Text(options[index]),
height: 40,
child: Center(
child: Text(options[index]),
),
), ),
), ),
), ),

View file

@ -54,7 +54,9 @@ class ProductPageScreen extends StatelessWidget {
context, context,
data.error, data.error,
) ?? ) ??
DefaultError(error: data.error); DefaultError(
error: data.error,
);
} }
List<Shop>? shops = data.data; List<Shop>? shops = data.data;
@ -102,9 +104,49 @@ class ProductPageScreen extends StatelessWidget {
configuration.onShopSelectionChange?.call( configuration.onShopSelectionChange?.call(
configuration.shoppingService.shopService.selectedShop!, configuration.shoppingService.shopService.selectedShop!,
); );
return _ProductPage( return Stack(
configuration: configuration, children: [
shops: shops, SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
configuration.shopselectorBuilder?.call(
context,
configuration,
shops,
configuration
.shoppingService.shopService.selectShop,
) ??
ShopSelector(
configuration: configuration,
shops: shops,
onTap: configuration
.shoppingService.shopService.selectShop,
),
configuration.selectedCategoryBuilder?.call(
configuration,
) ??
SelectedCategories(
configuration: configuration,
),
_ShopContents(
configuration: configuration,
),
],
),
),
Align(
alignment: Alignment.bottomCenter,
child: configuration.shoppingCartButtonBuilder != null
? configuration.shoppingCartButtonBuilder!(
context,
configuration,
)
: DefaultShoppingCartButton(
configuration: configuration,
),
),
],
); );
}, },
); );
@ -115,65 +157,6 @@ class ProductPageScreen extends StatelessWidget {
); );
} }
class _ProductPage extends StatelessWidget {
const _ProductPage({
required this.configuration,
required this.shops,
});
final ProductPageConfiguration configuration;
final List<Shop> shops;
@override
Widget build(BuildContext context) {
var pageContent = SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
configuration.shopselectorBuilder?.call(
context,
configuration,
shops,
configuration.shoppingService.shopService.selectShop,
) ??
ShopSelector(
configuration: configuration,
shops: shops,
onTap: configuration.shoppingService.shopService.selectShop,
),
configuration.selectedCategoryBuilder?.call(
configuration,
) ??
SelectedCategories(
configuration: configuration,
),
_ShopContents(
configuration: configuration,
),
],
),
);
return Stack(
children: [
pageContent,
Align(
alignment: Alignment.bottomCenter,
child: configuration.shoppingCartButtonBuilder != null
? configuration.shoppingCartButtonBuilder!(
context,
configuration,
)
: DefaultShoppingCartButton(
configuration: configuration,
),
),
],
);
}
}
class _ShopContents extends StatelessWidget { class _ShopContents extends StatelessWidget {
const _ShopContents({ const _ShopContents({
required this.configuration, required this.configuration,

View file

@ -1,15 +1,16 @@
// ignore_for_file: public_member_api_docs
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_shopping/flutter_shopping.dart"; import "package:flutter_shopping/flutter_shopping.dart";
import "package:flutter_shopping_local/flutter_shopping_local.dart"; import "package:flutter_shopping_local/flutter_shopping_local.dart";
/// User story for the shopping navigator.
class ShoppingNavigatorUserStory extends StatelessWidget { class ShoppingNavigatorUserStory extends StatelessWidget {
/// Constructor for the shopping navigator user story.
const ShoppingNavigatorUserStory({ const ShoppingNavigatorUserStory({
this.shoppingConfiguration, this.shoppingConfiguration,
super.key, super.key,
}); });
/// Shopping configuration.
final ShoppingConfiguration? shoppingConfiguration; final ShoppingConfiguration? shoppingConfiguration;
@override @override
@ -21,11 +22,15 @@ class ShoppingNavigatorUserStory extends StatelessWidget {
); );
} }
/// Shopping product page.
class ShoppingProductPage extends StatelessWidget { class ShoppingProductPage extends StatelessWidget {
/// Constructor for the shopping product page.
const ShoppingProductPage({ const ShoppingProductPage({
required this.shoppingConfiguration, required this.shoppingConfiguration,
super.key, super.key,
}); });
/// Shopping configuration.
final ShoppingConfiguration shoppingConfiguration; final ShoppingConfiguration shoppingConfiguration;
@override @override
@ -103,12 +108,15 @@ class ShoppingProductPage extends StatelessWidget {
} }
} }
/// Shopping cart.
class ShoppingCart extends StatelessWidget { class ShoppingCart extends StatelessWidget {
/// Constructor for the shopping cart.
const ShoppingCart({ const ShoppingCart({
required this.shoppingConfiguration, required this.shoppingConfiguration,
super.key, super.key,
}); });
/// Shopping configuration.
final ShoppingConfiguration shoppingConfiguration; final ShoppingConfiguration shoppingConfiguration;
@override @override
@ -150,12 +158,15 @@ class ShoppingCart extends StatelessWidget {
} }
} }
/// Shopping order details.
class ShoppingOrderDetails extends StatelessWidget { class ShoppingOrderDetails extends StatelessWidget {
/// Constructor for the shopping order details.
const ShoppingOrderDetails({ const ShoppingOrderDetails({
required this.shoppingConfiguration, required this.shoppingConfiguration,
super.key, super.key,
}); });
/// Shopping configuration.
final ShoppingConfiguration shoppingConfiguration; final ShoppingConfiguration shoppingConfiguration;
@override @override