diff --git a/lib/presentation/materials/materials_page.dart b/lib/presentation/materials/materials_page.dart index c78e2eb74..f439d7bf7 100644 --- a/lib/presentation/materials/materials_page.dart +++ b/lib/presentation/materials/materials_page.dart @@ -8,6 +8,7 @@ import 'package:genshindb/presentation/shared/sliver_nothing_found.dart'; import 'package:genshindb/presentation/shared/sliver_page_filter.dart'; import 'package:genshindb/presentation/shared/sliver_scaffold_with_fab.dart'; import 'package:genshindb/presentation/shared/styles.dart'; +import 'package:genshindb/presentation/shared/utils/size_utils.dart'; import 'widgets/material_bottom_sheet.dart'; import 'widgets/material_card.dart'; @@ -54,7 +55,7 @@ class MaterialsPage extends StatelessWidget { SliverPadding( padding: Styles.edgeInsetHorizontal5, sliver: SliverStaggeredGrid.countBuilder( - crossAxisCount: isPortrait ? 3 : 5, + crossAxisCount: SizeUtils.getCrossAxisCountForGrids(context, itemIsSmall: true), itemBuilder: (ctx, index) => MaterialCard.item(item: state.materials[index], isInSelectionMode: isInSelectionMode), itemCount: state.materials.length, crossAxisSpacing: isPortrait ? 10 : 5, diff --git a/lib/presentation/shared/details/detail_top_layout.dart b/lib/presentation/shared/details/detail_top_layout.dart index 387fa9c9c..992af5912 100644 --- a/lib/presentation/shared/details/detail_top_layout.dart +++ b/lib/presentation/shared/details/detail_top_layout.dart @@ -90,6 +90,11 @@ class CommonDetailTopLayout extends StatelessWidget { final isPortrait = mediaQuery.orientation == Orientation.portrait; final device = getDeviceType(mediaQuery.size); final descriptionWidth = (mediaQuery.size.width / (isPortrait ? 1 : 2)) / (device == DeviceScreenType.mobile ? 1.2 : 2); + final imgAlignment = showShadowImage + ? isPortrait + ? Alignment.centerLeft + : Alignment.bottomLeft + : Alignment.center; return Container( height: isPortrait ? getTopHeightForPortrait(context) : null, color: color, diff --git a/lib/presentation/weapon/weapon_page.dart b/lib/presentation/weapon/weapon_page.dart index 01541eb6f..cfbc86197 100644 --- a/lib/presentation/weapon/weapon_page.dart +++ b/lib/presentation/weapon/weapon_page.dart @@ -4,9 +4,19 @@ import 'package:genshindb/application/bloc.dart'; import 'package:genshindb/presentation/shared/loading.dart'; import 'package:genshindb/presentation/shared/scaffold_with_fab.dart'; import 'package:genshindb/presentation/weapon/widgets/weapon_detail_bottom.dart'; -import 'package:genshindb/presentation/weapon/widgets/weapon_detaill_top.dart'; +import 'package:genshindb/presentation/weapon/widgets/weapon_detail_top.dart'; class WeaponPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + final isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; + return isPortrait ? const _PortraitLayout() : const _LandscapeLayout(); + } +} + +class _PortraitLayout extends StatelessWidget { + const _PortraitLayout({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return ScaffoldWithFab( @@ -14,27 +24,30 @@ class WeaponPage extends StatelessWidget { builder: (context, state) { return state.map( loading: (_) => const Loading(useScaffold: false), - loaded: (s) => Stack( + loaded: (state) => Stack( + fit: StackFit.passthrough, + clipBehavior: Clip.none, + alignment: Alignment.topCenter, children: [ WeaponDetailTop( - name: s.name, - atk: s.atk, - rarity: s.rarity, - secondaryStatType: s.secondaryStat, - secondaryStatValue: s.secondaryStatValue, - type: s.weaponType, - locationType: s.locationType, - image: s.fullImage, + name: state.name, + atk: state.atk, + rarity: state.rarity, + secondaryStatType: state.secondaryStat, + secondaryStatValue: state.secondaryStatValue, + type: state.weaponType, + locationType: state.locationType, + image: state.fullImage, ), WeaponDetailBottom( - description: s.description, - rarity: s.rarity, - secondaryStatType: s.secondaryStat, - stats: s.stats, - ascensionMaterials: s.ascensionMaterials, - refinements: s.refinements, - charImgs: s.charImages, - craftingMaterials: s.craftingMaterials, + rarity: state.rarity, + description: state.description, + ascensionMaterials: state.ascensionMaterials, + charImgs: state.charImages, + craftingMaterials: state.craftingMaterials, + refinements: state.refinements, + secondaryStatType: state.secondaryStat, + stats: state.stats, ), ], ), @@ -44,3 +57,49 @@ class WeaponPage extends StatelessWidget { ); } } + +class _LandscapeLayout extends StatelessWidget { + const _LandscapeLayout({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: BlocBuilder( + builder: (ctx, state) => state.map( + loading: (_) => const Loading(useScaffold: false), + loaded: (state) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: WeaponDetailTop( + name: state.name, + atk: state.atk, + rarity: state.rarity, + secondaryStatType: state.secondaryStat, + secondaryStatValue: state.secondaryStatValue, + type: state.weaponType, + locationType: state.locationType, + image: state.fullImage, + ), + ), + Expanded( + child: WeaponDetailBottom( + rarity: state.rarity, + description: state.description, + ascensionMaterials: state.ascensionMaterials, + charImgs: state.charImages, + craftingMaterials: state.craftingMaterials, + refinements: state.refinements, + secondaryStatType: state.secondaryStat, + stats: state.stats, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/weapon/widgets/weapon_detail_ascension_materials_card.dart b/lib/presentation/weapon/widgets/weapon_detail_ascension_materials_card.dart index 71d893230..cd3bbccb5 100644 --- a/lib/presentation/weapon/widgets/weapon_detail_ascension_materials_card.dart +++ b/lib/presentation/weapon/widgets/weapon_detail_ascension_materials_card.dart @@ -3,6 +3,7 @@ import 'package:genshindb/domain/models/models.dart'; import 'package:genshindb/generated/l10n.dart'; import 'package:genshindb/presentation/shared/item_description_detail.dart'; import 'package:genshindb/presentation/shared/styles.dart'; +import 'package:genshindb/presentation/shared/utils/size_utils.dart'; import 'package:genshindb/presentation/shared/wrapped_ascension_material.dart'; class WeaponDetailAscensionMaterialsCard extends StatelessWidget { @@ -18,6 +19,7 @@ class WeaponDetailAscensionMaterialsCard extends StatelessWidget { @override Widget build(BuildContext context) { final s = S.of(context); + final size = SizeUtils.getSizeForCircleImages(context, smallImage: true); final body = Card( elevation: Styles.cardTenElevation, shape: Styles.cardShape, @@ -46,15 +48,21 @@ class WeaponDetailAscensionMaterialsCard extends StatelessWidget { ), ], ), - ...ascensionMaterials.map((e) => _buildStatProgressionRow(e)).toList(), + ...ascensionMaterials.map((e) => _buildStatProgressionRow(e, size)).toList(), ], ), ); return ItemDescriptionDetail(title: s.ascensionMaterials, body: body, textColor: rarityColor); } - TableRow _buildStatProgressionRow(WeaponFileAscensionMaterial model) { - final materials = model.materials.map((m) => WrappedAscensionMaterial(image: m.fullImagePath, quantity: m.quantity)).toList(); + TableRow _buildStatProgressionRow(WeaponFileAscensionMaterial model, double size) { + final materials = model.materials + .map((m) => WrappedAscensionMaterial( + image: m.fullImagePath, + quantity: m.quantity, + size: size, + )) + .toList(); return TableRow(children: [ TableCell( verticalAlignment: TableCellVerticalAlignment.middle, diff --git a/lib/presentation/weapon/widgets/weapon_detail_bottom.dart b/lib/presentation/weapon/widgets/weapon_detail_bottom.dart index 5e537153c..bbaa19e8d 100644 --- a/lib/presentation/weapon/widgets/weapon_detail_bottom.dart +++ b/lib/presentation/weapon/widgets/weapon_detail_bottom.dart @@ -3,9 +3,12 @@ import 'package:genshindb/domain/enums/enums.dart'; import 'package:genshindb/domain/models/models.dart'; import 'package:genshindb/generated/l10n.dart'; import 'package:genshindb/presentation/shared/circle_character.dart'; +import 'package:genshindb/presentation/shared/details/detail_bottom_portrait_layout.dart'; +import 'package:genshindb/presentation/shared/details/detail_tab_landscape_layout.dart'; import 'package:genshindb/presentation/shared/extensions/rarity_extensions.dart'; import 'package:genshindb/presentation/shared/item_description_detail.dart'; import 'package:genshindb/presentation/shared/styles.dart'; +import 'package:genshindb/presentation/shared/utils/size_utils.dart'; import 'package:genshindb/presentation/weapon/widgets/weapon_detail_stats_card.dart'; import 'weapon_detail_ascension_materials_card.dart'; @@ -36,67 +39,200 @@ class WeaponDetailBottom extends StatelessWidget { @override Widget build(BuildContext context) { - final s = S.of(context); - final rarityColor = rarity.getRarityColors().last; - return Card( - margin: const EdgeInsets.only(top: 280, right: 10, left: 10), - shape: Styles.cardItemDetailShape, - child: Padding( - padding: Styles.edgeInsetAll10, - child: Column( - children: [ - _buildDescription(description, rarity, context), - if (charImgs.isNotEmpty) - ItemDescriptionDetail( - title: s.builds, - body: Wrap( - alignment: WrapAlignment.center, - children: charImgs.map((e) => CircleCharacter(image: e)).toList(), - ), - textColor: rarityColor, - ), - if (craftingMaterials.isNotEmpty) - WeaponCraftingMaterials( - materials: craftingMaterials, - rarityColor: rarityColor, - ), - if (ascensionMaterials.isNotEmpty) - WeaponDetailAscensionMaterialsCard( - ascensionMaterials: ascensionMaterials, - rarityColor: rarityColor, - ), - if (refinements.isNotEmpty) - WeaponDetailRefinementsCard( - refinements: refinements, - rarityColor: rarityColor, - ), - if (stats.isNotEmpty) - WeaponDetailStatsCard( - secondaryStatType: secondaryStatType, - rarityColor: rarityColor, - stats: stats, - ), - ], - ), - ), - ); + final isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; + return isPortrait + ? _PortraitLayout( + description: description, + rarity: rarity, + secondaryStatType: secondaryStatType, + craftingMaterials: craftingMaterials, + ascensionMaterials: ascensionMaterials, + refinements: refinements, + stats: stats, + charImgs: charImgs, + ) + : _LandscapeLayout( + description: description, + rarity: rarity, + secondaryStatType: secondaryStatType, + craftingMaterials: craftingMaterials, + ascensionMaterials: ascensionMaterials, + refinements: refinements, + stats: stats, + charImgs: charImgs, + ); } +} - Widget _buildDescription(String description, int rarity, BuildContext context) { +class _PortraitLayout extends StatelessWidget { + final String description; + final int rarity; + final StatType secondaryStatType; + final List craftingMaterials; + final List ascensionMaterials; + final List refinements; + final List stats; + final List charImgs; + + const _PortraitLayout({ + Key? key, + required this.description, + required this.rarity, + required this.secondaryStatType, + required this.craftingMaterials, + required this.ascensionMaterials, + required this.refinements, + required this.stats, + required this.charImgs, + }) : super(key: key); + + @override + Widget build(BuildContext context) { final s = S.of(context); - final body = Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + final rarityColor = rarity.getRarityColors().last; + return CommonDetailBottomPortraitLayout( children: [ Container( margin: const EdgeInsets.only(bottom: 10), child: ItemDescriptionDetail( title: s.description, body: Container(margin: const EdgeInsets.symmetric(horizontal: 5), child: Text(description)), - textColor: rarity.getRarityColors().last, + textColor: rarityColor, + ), + ), + if (charImgs.isNotEmpty) + ItemDescriptionDetail( + title: s.builds, + body: Wrap( + alignment: WrapAlignment.center, + children: charImgs.map((e) => CircleCharacter(image: e, radius: SizeUtils.getSizeForCircleImages(context))).toList(), + ), + textColor: rarityColor, + ), + if (craftingMaterials.isNotEmpty) + WeaponCraftingMaterials( + materials: craftingMaterials, + rarityColor: rarityColor, + ), + if (ascensionMaterials.isNotEmpty) + WeaponDetailAscensionMaterialsCard( + ascensionMaterials: ascensionMaterials, + rarityColor: rarityColor, + ), + if (refinements.isNotEmpty) + WeaponDetailRefinementsCard( + refinements: refinements, + rarityColor: rarityColor, + ), + if (stats.isNotEmpty) + WeaponDetailStatsCard( + secondaryStatType: secondaryStatType, + rarityColor: rarityColor, + stats: stats, + ), + ], + ); + } +} + +class _LandscapeLayout extends StatelessWidget { + final String description; + final int rarity; + final StatType secondaryStatType; + final List craftingMaterials; + final List ascensionMaterials; + final List refinements; + final List stats; + final List charImgs; + + const _LandscapeLayout({ + Key? key, + required this.description, + required this.rarity, + required this.secondaryStatType, + required this.craftingMaterials, + required this.ascensionMaterials, + required this.refinements, + required this.stats, + required this.charImgs, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final s = S.of(context); + final tabs = [ + s.description, + s.materials, + ]; + + if (refinements.isNotEmpty) { + tabs.add(s.refinements); + } + + if (stats.isNotEmpty) { + tabs.add(s.stats); + } + final rarityColor = rarity.getRarityColors().last; + return CommonDetailTabLandscapeLayout( + color: rarityColor, + tabs: tabs, + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + margin: const EdgeInsets.only(bottom: 10), + child: ItemDescriptionDetail( + title: s.description, + body: Container(margin: Styles.edgeInsetHorizontal5, child: Text(description)), + textColor: rarityColor, + ), + ), + if (charImgs.isNotEmpty) + ItemDescriptionDetail( + title: s.builds, + body: Wrap( + alignment: WrapAlignment.center, + children: charImgs.map((e) => CircleCharacter(image: e, radius: SizeUtils.getSizeForCircleImages(context))).toList(), + ), + textColor: rarityColor, + ), + ], ), ), + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + WeaponDetailAscensionMaterialsCard( + ascensionMaterials: ascensionMaterials, + rarityColor: rarityColor, + ), + if (craftingMaterials.isNotEmpty) + WeaponCraftingMaterials( + materials: craftingMaterials, + rarityColor: rarityColor, + ) + ], + ), + ), + if (refinements.isNotEmpty) + SingleChildScrollView( + child: WeaponDetailRefinementsCard( + refinements: refinements, + rarityColor: rarityColor, + ), + ), + if (stats.isNotEmpty) + SingleChildScrollView( + child: WeaponDetailStatsCard( + secondaryStatType: secondaryStatType, + rarityColor: rarityColor, + stats: stats, + ), + ), ], ); - return body; } } diff --git a/lib/presentation/weapon/widgets/weapon_detail_crafting_materials.dart b/lib/presentation/weapon/widgets/weapon_detail_crafting_materials.dart index 17c8d13ae..800a76b55 100644 --- a/lib/presentation/weapon/widgets/weapon_detail_crafting_materials.dart +++ b/lib/presentation/weapon/widgets/weapon_detail_crafting_materials.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:genshindb/domain/models/models.dart'; import 'package:genshindb/generated/l10n.dart'; import 'package:genshindb/presentation/shared/item_description_detail.dart'; +import 'package:genshindb/presentation/shared/utils/size_utils.dart'; import 'package:genshindb/presentation/shared/wrapped_ascension_material.dart'; class WeaponCraftingMaterials extends StatelessWidget { @@ -17,7 +18,8 @@ class WeaponCraftingMaterials extends StatelessWidget { @override Widget build(BuildContext context) { final s = S.of(context); - final rows = materials.map((m) => WrappedAscensionMaterial(image: m.fullImagePath, quantity: m.quantity, size: 50)).toList(); + final size = SizeUtils.getSizeForCircleImages(context); + final rows = materials.map((m) => WrappedAscensionMaterial(image: m.fullImagePath, quantity: m.quantity, size: size * 1.2)).toList(); final body = Wrap( alignment: WrapAlignment.center, diff --git a/lib/presentation/weapon/widgets/weapon_detail_general_card.dart b/lib/presentation/weapon/widgets/weapon_detail_general_card.dart index c8208318f..67c135fef 100644 --- a/lib/presentation/weapon/widgets/weapon_detail_general_card.dart +++ b/lib/presentation/weapon/widgets/weapon_detail_general_card.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:genshindb/domain/enums/enums.dart'; import 'package:genshindb/generated/l10n.dart'; +import 'package:genshindb/presentation/shared/details/detail_general_card.dart'; import 'package:genshindb/presentation/shared/extensions/i18n_extensions.dart'; import 'package:genshindb/presentation/shared/extensions/rarity_extensions.dart'; import 'package:genshindb/presentation/shared/item_description.dart'; -import 'package:genshindb/presentation/shared/rarity.dart'; -import 'package:genshindb/presentation/shared/styles.dart'; class WeaponDetailGeneralCard extends StatelessWidget { final String name; @@ -30,20 +29,17 @@ class WeaponDetailGeneralCard extends StatelessWidget { @override Widget build(BuildContext context) { final s = S.of(context); - final theme = Theme.of(context); - final details = Column( - crossAxisAlignment: CrossAxisAlignment.start, + return DetailGeneralCard( + itemName: name, + color: rarity.getRarityColors().first, + rarity: rarity, children: [ - Text( - name, - style: theme.textTheme.headline5!.copyWith(fontWeight: FontWeight.bold, color: Colors.white), - ), - Rarity(stars: rarity, starSize: 25, alignment: MainAxisAlignment.start), ItemDescription( title: s.type, widget: Text( s.translateWeaponType(type), style: const TextStyle(color: Colors.white), + overflow: TextOverflow.ellipsis, ), useColumn: false, ), @@ -52,6 +48,7 @@ class WeaponDetailGeneralCard extends StatelessWidget { widget: Text( '$atk', style: const TextStyle(color: Colors.white), + overflow: TextOverflow.ellipsis, ), useColumn: false, ), @@ -67,18 +64,11 @@ class WeaponDetailGeneralCard extends StatelessWidget { widget: Text( s.translateItemLocationType(locationType), style: const TextStyle(color: Colors.white), + overflow: TextOverflow.ellipsis, ), useColumn: false, ), ], ); - - return Card( - color: rarity.getRarityColors().first.withOpacity(0.1), - elevation: Styles.cardTenElevation, - margin: Styles.edgeInsetAll10, - shape: Styles.cardShape, - child: Padding(padding: Styles.edgeInsetAll10, child: details), - ); } } diff --git a/lib/presentation/weapon/widgets/weapon_detail_top.dart b/lib/presentation/weapon/widgets/weapon_detail_top.dart new file mode 100644 index 000000000..9c6841d6a --- /dev/null +++ b/lib/presentation/weapon/widgets/weapon_detail_top.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:genshindb/application/bloc.dart'; +import 'package:genshindb/domain/enums/enums.dart'; +import 'package:genshindb/presentation/shared/details/detail_top_layout.dart'; +import 'package:genshindb/presentation/shared/extensions/rarity_extensions.dart'; +import 'package:genshindb/presentation/shared/loading.dart'; + +import 'weapon_detail_general_card.dart'; + +const double imageHeight = 320; +const double imgSize = 28; + +class WeaponDetailTop extends StatelessWidget { + final String name; + final int atk; + final int rarity; + final StatType secondaryStatType; + final double secondaryStatValue; + final WeaponType type; + final ItemLocationType locationType; + final String image; + + const WeaponDetailTop({ + Key? key, + required this.name, + required this.atk, + required this.rarity, + required this.secondaryStatType, + required this.secondaryStatValue, + required this.type, + required this.locationType, + required this.image, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + final isPortrait = mediaQuery.orientation == Orientation.portrait; + return CommonDetailTopLayout( + fullImage: image, + secondFullImage: image, + decoration: BoxDecoration(gradient: rarity.getRarityGradient()), + heightOnLandscape: mediaQuery.size.height * 0.8, + showShadowImage: isPortrait, + charDescriptionHeight: 200, + generalCard: WeaponDetailGeneralCard( + type: type, + atk: atk, + locationType: locationType, + name: name, + rarity: rarity, + secondaryStatValue: secondaryStatValue, + statType: secondaryStatType, + ), + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0.0, + actions: [ + BlocBuilder( + builder: (ctx, state) => state.map( + loading: (_) => const Loading(useScaffold: false), + loaded: (state) => IconButton( + icon: Icon(state.isInInventory ? Icons.favorite : Icons.favorite_border), + color: Colors.red, + onPressed: () => _favoriteWeapon(state.key, state.isInInventory, context), + ), + ), + ), + ], + ), + ); + } + + void _favoriteWeapon(String key, bool isInInventory, BuildContext context) { + final event = !isInInventory ? InventoryEvent.addWeapon(key: key) : InventoryEvent.deleteWeapon(key: key); + context.read().add(event); + } +} diff --git a/lib/presentation/weapon/widgets/weapon_detaill_top.dart b/lib/presentation/weapon/widgets/weapon_detaill_top.dart deleted file mode 100644 index 93e29488e..000000000 --- a/lib/presentation/weapon/widgets/weapon_detaill_top.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:genshindb/application/bloc.dart'; -import 'package:genshindb/domain/enums/enums.dart'; -import 'package:genshindb/presentation/shared/extensions/rarity_extensions.dart'; -import 'package:genshindb/presentation/shared/loading.dart'; - -import 'weapon_detail_general_card.dart'; - -const double imageHeight = 320; -const double imgSize = 28; - -class WeaponDetailTop extends StatelessWidget { - final String name; - final int atk; - final int rarity; - final StatType secondaryStatType; - final double secondaryStatValue; - final WeaponType type; - final ItemLocationType locationType; - final String image; - - const WeaponDetailTop({ - Key? key, - required this.name, - required this.atk, - required this.rarity, - required this.secondaryStatType, - required this.secondaryStatValue, - required this.type, - required this.locationType, - required this.image, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - final isPortrait = mediaQuery.orientation == Orientation.portrait; - final descriptionWidth = mediaQuery.size.width / (isPortrait ? 1.2 : 2); - //TODO: IM NOT SURE HOW THIS WILL LOOK LIKE IN BIGGER DEVICES - // final padding = mediaQuery.padding; - // final screenHeight = mediaQuery.size.height - padding.top - padding.bottom; - - return Container( - decoration: BoxDecoration(gradient: rarity.getRarityGradient()), - child: Stack( - fit: StackFit.passthrough, - alignment: Alignment.center, - children: [ - Align( - alignment: Alignment.topRight, - child: Container( - transform: Matrix4.translationValues(80, -30, 0.0), - child: Opacity( - opacity: 0.5, - child: Image.asset( - image, - width: 350, - height: imageHeight, - ), - ), - ), - ), - Align( - alignment: Alignment.topLeft, - child: Image.asset( - image, - width: 340, - height: imageHeight, - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - width: descriptionWidth, - margin: const EdgeInsets.symmetric(horizontal: 30), - child: WeaponDetailGeneralCard( - type: type, - atk: atk, - locationType: locationType, - name: name, - rarity: rarity, - secondaryStatValue: secondaryStatValue, - statType: secondaryStatType, - ), - ), - ), - Positioned( - top: 0.0, - left: 0.0, - right: 0.0, - child: AppBar( - backgroundColor: Colors.transparent, - elevation: 0.0, - actions: [ - BlocBuilder( - builder: (ctx, state) => state.map( - loading: (_) => const Loading(useScaffold: false), - loaded: (state) => IconButton( - icon: Icon(state.isInInventory ? Icons.favorite : Icons.favorite_border), - color: Colors.red, - onPressed: () => _favoriteWeapon(state.key, state.isInInventory, context), - ), - ), - ), - ], - ), - ), - ], - ), - ); - } - - void _favoriteWeapon(String key, bool isInInventory, BuildContext context) { - final event = !isInInventory ? InventoryEvent.addWeapon(key: key) : InventoryEvent.deleteWeapon(key: key); - context.read().add(event); - } -} diff --git a/lib/presentation/weapons/weapons_page.dart b/lib/presentation/weapons/weapons_page.dart index c0f800760..b715c140f 100644 --- a/lib/presentation/weapons/weapons_page.dart +++ b/lib/presentation/weapons/weapons_page.dart @@ -9,7 +9,7 @@ import 'package:genshindb/presentation/shared/sliver_nothing_found.dart'; import 'package:genshindb/presentation/shared/sliver_page_filter.dart'; import 'package:genshindb/presentation/shared/sliver_scaffold_with_fab.dart'; import 'package:genshindb/presentation/shared/styles.dart'; -import 'package:genshindb/presentation/shared/utils/grid_utils.dart'; +import 'package:genshindb/presentation/shared/utils/size_utils.dart'; import 'widgets/weapon_bottom_sheet.dart'; import 'widgets/weapon_card.dart'; @@ -83,7 +83,7 @@ class _WeaponsPageState extends State with AutomaticKeepAliveClient return SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 5), sliver: SliverStaggeredGrid.countBuilder( - crossAxisCount: GridUtils.getCrossAxisCountForGrids(context), + crossAxisCount: SizeUtils.getCrossAxisCountForGrids(context), itemBuilder: (ctx, index) { final weapon = weapons[index]; return WeaponCard(