diff --git a/lib/src/view/play/create_custom_game_screen.dart b/lib/src/view/play/create_custom_game_screen.dart index 6f6deeb516..ec14f20917 100644 --- a/lib/src/view/play/create_custom_game_screen.dart +++ b/lib/src/view/play/create_custom_game_screen.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:deep_pick/deep_pick.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lichess_mobile/src/model/account/account_repository.dart'; @@ -31,11 +30,11 @@ import 'package:lichess_mobile/src/widgets/expanded_section.dart'; import 'package:lichess_mobile/src/widgets/feedback.dart'; import 'package:lichess_mobile/src/widgets/list.dart'; import 'package:lichess_mobile/src/widgets/non_linear_slider.dart'; -import 'package:lichess_mobile/src/widgets/platform.dart'; +import 'package:lichess_mobile/src/widgets/platform_scaffold.dart'; enum _ViewMode { create, challenges } -class CreateCustomGameScreen extends StatelessWidget { +class CreateCustomGameScreen extends StatefulWidget { const CreateCustomGameScreen(); static Route buildRoute(BuildContext context) { @@ -47,27 +46,11 @@ class CreateCustomGameScreen extends StatelessWidget { } @override - Widget build(BuildContext context) { - return PlatformWidget(androidBuilder: _buildAndroid, iosBuilder: _buildIos); - } - - Widget _buildIos(BuildContext context) { - return const _CupertinoBody(); - } - - Widget _buildAndroid(BuildContext context) { - return const _AndroidBody(); - } + State createState() => _CreateCustomGameScreenState(); } -class _AndroidBody extends StatefulWidget { - const _AndroidBody(); - - @override - State<_AndroidBody> createState() => _AndroidBodyState(); -} - -class _AndroidBodyState extends State<_AndroidBody> with TickerProviderStateMixin { +class _CreateCustomGameScreenState extends State + with TickerProviderStateMixin { late final TabController _tabController; @override @@ -92,87 +75,26 @@ class _AndroidBodyState extends State<_AndroidBody> with TickerProviderStateMixi @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(context.l10n.custom), - bottom: TabBar( - controller: _tabController, - tabs: [ - Tab(text: context.l10n.createAGame), - Tab(text: context.l10n.mobileCustomGameJoinAGame), - ], - ), + return PlatformScaffold( + appBarTitle: Text(context.l10n.custom), + appBarBottom: TabBar( + controller: _tabController, + tabs: [ + Tab(text: context.l10n.createAGame), + Tab(text: context.l10n.mobileCustomGameJoinAGame), + ], ), body: TabBarView( controller: _tabController, children: [ - _TabView(sliver: _CreateGameBody(setViewMode: setViewMode)), - _TabView(sliver: _ChallengesBody(setViewMode: setViewMode)), + _CreateGameBody(setViewMode: setViewMode), + _ChallengesBody(setViewMode: setViewMode), ], ), ); } } -class _CupertinoBody extends StatefulWidget { - const _CupertinoBody(); - - @override - _CupertinoBodyState createState() => _CupertinoBodyState(); -} - -class _CupertinoBodyState extends State<_CupertinoBody> { - _ViewMode _selectedSegment = _ViewMode.create; - - void setViewMode(_ViewMode mode) { - setState(() { - _selectedSegment = mode; - }); - } - - @override - Widget build(BuildContext context) { - final tabSwitcher = CupertinoSlidingSegmentedControl<_ViewMode>( - groupValue: _selectedSegment, - children: { - _ViewMode.create: Text(context.l10n.createAGame), - _ViewMode.challenges: Text(context.l10n.mobileCustomGameJoinAGame), - }, - onValueChanged: (_ViewMode? view) { - if (view != null) { - setState(() { - _selectedSegment = view; - }); - } - }, - ); - return CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - middle: Text(context.l10n.custom), - bottom: PreferredSize(preferredSize: const Size.fromHeight(44.0), child: tabSwitcher), - ), - child: _TabView( - sliver: - _selectedSegment == _ViewMode.create - ? _CreateGameBody(setViewMode: setViewMode) - : _ChallengesBody(setViewMode: setViewMode), - ), - ); - } -} - -class _TabView extends StatelessWidget { - const _TabView({required this.sliver}); - - final Widget sliver; - - @override - Widget build(BuildContext context) { - final edgeInsets = MediaQuery.paddingOf(context) + Styles.verticalBodyPadding; - return CustomScrollView(slivers: [SliverPadding(padding: edgeInsets, sliver: sliver)]); - } -} - class _ChallengesBody extends ConsumerStatefulWidget { const _ChallengesBody({required this.setViewMode}); @@ -230,7 +152,7 @@ class _ChallengesBodyState extends ConsumerState<_ChallengesBody> { data: (challenges) { final supportedChallenges = challenges.where((challenge) => challenge.variant.isPlaySupported).toList(); - return SliverList.separated( + return ListView.separated( itemCount: supportedChallenges.length, separatorBuilder: (context, index) => @@ -276,14 +198,9 @@ class _ChallengesBodyState extends ConsumerState<_ChallengesBody> { ); }, loading: () { - return const SliverFillRemaining( - child: Center(child: CircularProgressIndicator.adaptive()), - ); + return const Center(child: CircularProgressIndicator.adaptive()); }, - error: - (error, stack) => SliverFillRemaining( - child: Center(child: Text(context.l10n.mobileCustomGameJoinAGame)), - ), + error: (error, stack) => Center(child: Text(context.l10n.mobileCustomGameJoinAGame)), ); } } @@ -452,10 +369,11 @@ class _CreateGameBodyState extends ConsumerState<_CreateGameBody> { account?.perfs[timeControl == TimeControl.realTime ? preferences.perfFromCustom : Perf.correspondence]; - return SliverPadding( - padding: Styles.sectionBottomPadding, - sliver: SliverList( - delegate: SliverChildListDelegate([ + return Center( + child: ListView( + padding: MediaQuery.paddingOf(context) + Styles.verticalBodyPadding, + shrinkWrap: true, + children: [ if (account != null) PlatformListTile( harmonizeCupertinoTitleStyle: true, @@ -577,16 +495,12 @@ class _CreateGameBodyState extends ConsumerState<_CreateGameBody> { ); }, ), - ]), + ], ), ); }, - loading: - () => - const SliverFillRemaining(child: Center(child: CircularProgressIndicator.adaptive())), - error: - (error, stackTrace) => - const SliverFillRemaining(child: Center(child: Text('Could not load account data'))), + loading: () => const Center(child: CircularProgressIndicator.adaptive()), + error: (error, stackTrace) => const Center(child: Text('Could not load account data')), ); } }