wonders/lib/ui/screens/wonder_details/wonders_details_screen.dart

105 lines
3.5 KiB
Dart
Raw Normal View History

2022-08-29 20:38:28 -06:00
import 'package:wonders/common_libs.dart';
import 'package:wonders/ui/common/lazy_indexed_stack.dart';
import 'package:wonders/ui/common/measurable_widget.dart';
import 'package:wonders/ui/screens/artifact/artifact_carousel/artifact_carousel_screen.dart';
import 'package:wonders/ui/screens/editorial/editorial_screen.dart';
import 'package:wonders/ui/screens/photo_gallery/photo_gallery.dart';
import 'package:wonders/ui/screens/wonder_details/wonder_details_tab_menu.dart';
import 'package:wonders/ui/screens/wonder_events/wonder_events.dart';
class WonderDetailsScreen extends StatefulWidget with GetItStatefulWidgetMixin {
WonderDetailsScreen({Key? key, required this.type, this.tabIndex = 0}) : super(key: key);
2022-08-29 20:38:28 -06:00
final WonderType type;
final int tabIndex;
2022-08-29 20:38:28 -06:00
@override
State<WonderDetailsScreen> createState() => _WonderDetailsScreenState();
}
class _WonderDetailsScreenState extends State<WonderDetailsScreen>
with GetItStateMixin, SingleTickerProviderStateMixin {
late final _tabController = TabController(
length: 4,
vsync: this,
initialIndex: _clampIndex(widget.tabIndex),
)..addListener(_handleTabChanged);
2022-08-29 20:38:28 -06:00
AnimationController? _fade;
double? _tabBarSize;
bool _useNavRail = false;
2022-08-29 20:38:28 -06:00
@override
void didUpdateWidget(covariant WonderDetailsScreen oldWidget) {
if (oldWidget.tabIndex != widget.tabIndex) {
_tabController.index = _clampIndex(widget.tabIndex);
}
super.didUpdateWidget(oldWidget);
}
2022-08-29 20:38:28 -06:00
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
int _clampIndex(int index) => index.clamp(0, 3);
2022-08-29 20:38:28 -06:00
void _handleTabChanged() {
_fade?.forward(from: 0);
setState(() {});
}
void _handleTabTapped(int index) {
_tabController.index = index;
context.go(ScreenPaths.wonderDetails(widget.type, tabIndex: _tabController.index));
}
2022-08-29 20:38:28 -06:00
void _handleTabMenuSized(Size size) {
setState(() {
_tabBarSize = (_useNavRail ? size.width : size.height) - WonderDetailsTabMenu.buttonInset;
});
2022-08-29 20:38:28 -06:00
}
@override
Widget build(BuildContext context) {
_useNavRail = appLogic.shouldUseNavRail();
2022-08-29 20:38:28 -06:00
final wonder = wondersLogic.getData(widget.type);
int tabIndex = _tabController.index;
bool showTabBarBg = tabIndex != 1;
final tabBarSize = _tabBarSize ?? 0;
final menuPadding = _useNavRail ? EdgeInsets.only(left: tabBarSize) : EdgeInsets.only(bottom: tabBarSize);
2022-08-29 20:38:28 -06:00
return ColoredBox(
color: Colors.black,
child: Stack(
children: [
/// Fullscreen tab views
LazyIndexedStack(
index: _tabController.index,
children: [
2023-04-26 10:23:00 -06:00
WonderEditorialScreen(wonder, contentPadding: menuPadding),
2022-08-29 20:38:28 -06:00
PhotoGallery(collectionId: wonder.unsplashCollectionId, wonderType: wonder.type),
ArtifactCarouselScreen(type: wonder.type, contentPadding: menuPadding),
WonderEvents(type: widget.type, contentPadding: menuPadding),
2022-08-29 20:38:28 -06:00
],
),
/// Tab menu
Align(
alignment: _useNavRail ? Alignment.centerLeft : Alignment.bottomCenter,
2023-04-26 10:23:00 -06:00
child: MeasurableWidget(
onChange: _handleTabMenuSized,
child: WonderDetailsTabMenu(
tabController: _tabController,
onTap: _handleTabTapped,
2023-04-26 10:23:00 -06:00
wonderType: wonder.type,
showBg: showTabBarBg,
axis: _useNavRail ? Axis.vertical : Axis.horizontal),
2022-08-29 20:38:28 -06:00
),
),
],
),
);
}
}