diff --git a/lib/src/ui/pages/calendar.dart b/lib/src/ui/pages/calendar.dart index 6d1cf81..586a307 100644 --- a/lib/src/ui/pages/calendar.dart +++ b/lib/src/ui/pages/calendar.dart @@ -84,6 +84,9 @@ class CalendarPage extends StatefulWidget { } class CalendarPageState extends State { + /// State for the "refreshing" overlay. + OverlayEntry? _overlayEntry; + List _renderWeekdayList( BuildContext context, Weekday day, @@ -177,112 +180,20 @@ class CalendarPageState extends State { listenWhen: (previous, current) => previous.refreshing != current.refreshing, listener: (context, state) { - // Force an update if (!state.refreshing) { - setState(() {}); - } - }, - child: WillPopScope( - onWillPop: () async => - !context.read().state.refreshing, - child: Stack( - children: [ - Positioned( - left: 0, - right: 0, - top: 0, - bottom: 0, - child: Padding( - padding: const EdgeInsetsGeometry.symmetric( - horizontal: 12, - ), - child: CustomScrollView( - slivers: [ - // Render all available weekdays - ..._renderWeekdayList( - context, - Weekday.unknown, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.monday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.tuesday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.wednesday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.thursday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.friday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.saturday, - airingAnimeMap, - ), - ..._renderWeekdayList( - context, - Weekday.sunday, - airingAnimeMap, - ), - - // Provide a nice bottom padding, while keeping the elastic effect attached - // to the bottom-most edge. - const SliverToBoxAdapter( - child: SizedBox( - height: 16, - ), - ), - ], - ), - ), - ), - Positioned( - left: 0, - right: 0, - top: 0, - bottom: 0, - child: BlocBuilder( - buildWhen: (previous, current) => - previous.refreshing != current.refreshing, - builder: (context, state) { - if (!state.refreshing) { - return const SizedBox(); - } - - return const ModalBarrier( + _overlayEntry?.remove(); + _overlayEntry?.dispose(); + _overlayEntry = null; + } else { + _overlayEntry = OverlayEntry( + builder: (context) => SafeArea( + child: Stack( + children: [ + const ModalBarrier( dismissible: false, color: Colors.black54, - ); - }, - ), - ), - Positioned( - left: 0, - right: 0, - top: 0, - bottom: 0, - child: BlocBuilder( - builder: (context, state) { - if (!state.refreshing) { - return const SizedBox(); - } - - return Center( + ), + Center( child: SizedBox( width: 150, height: 150, @@ -299,22 +210,89 @@ class CalendarPageState extends State { padding: EdgeInsets.all(25), child: CircularProgressIndicator(), ), - Text( - t.settings.importIndicator( - current: state.refreshingCount, - total: state.refreshingTotal, + BlocBuilder( + builder: (context, state) => Text( + t.settings.importIndicator( + current: state.refreshingCount, + total: state.refreshingTotal, + ), + style: Theme.of( + context, + ).textTheme.bodyMedium, ), - style: Theme.of(context).textTheme.bodyMedium, ), ], ), ), ), - ); - }, + ), + ], ), ), - ], + ); + Overlay.of(context).insert(_overlayEntry!); + } + }, + child: WillPopScope( + onWillPop: () async => + !context.read().state.refreshing, + child: Padding( + padding: const EdgeInsetsGeometry.symmetric( + horizontal: 12, + ), + child: CustomScrollView( + slivers: [ + // Render all available weekdays + ..._renderWeekdayList( + context, + Weekday.unknown, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.monday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.tuesday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.wednesday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.thursday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.friday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.saturday, + airingAnimeMap, + ), + ..._renderWeekdayList( + context, + Weekday.sunday, + airingAnimeMap, + ), + + // Provide a nice bottom padding, while keeping the elastic effect attached + // to the bottom-most edge. + const SliverToBoxAdapter( + child: SizedBox( + height: 16, + ), + ), + ], + ), ), ), );