mirror of
https://github.com/rzuasti/oott.git
synced 2026-07-08 19:21:54 +02:00
Changing pages in the notifications or devices list gave no cue that the next page was loading. Render an indeterminate progress bar at the shell level, pinned flush against the bottom of the page body (above the nav bar on phones, the screen bottom on wide layouts), driven by a shared paginationLoading notifier the lists set while fetching. The pagination bar keeps disabling its buttons during the fetch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
59 lines
1.8 KiB
Dart
59 lines
1.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
class PaginationBar extends StatelessWidget {
|
|
const PaginationBar({
|
|
super.key,
|
|
required this.currentPage,
|
|
required this.hasNextPage,
|
|
required this.isLoading,
|
|
required this.onPageChanged,
|
|
});
|
|
|
|
final int currentPage;
|
|
final bool hasNextPage;
|
|
final bool isLoading;
|
|
final ValueChanged<int> onPageChanged;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final canGoBack = currentPage > 0 && !isLoading;
|
|
final canGoForward = hasNextPage && !isLoading;
|
|
// While a page change is in flight the buttons disable so the tap reads as
|
|
// registered and double-taps are blocked; the progress cue itself is drawn
|
|
// by the app shell at the bottom of the page body.
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 8),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
IconButton.outlined(
|
|
onPressed: canGoBack ? () => onPageChanged(0) : null,
|
|
icon: const Icon(Icons.first_page),
|
|
tooltip: 'First page',
|
|
),
|
|
const SizedBox(width: 8),
|
|
IconButton.outlined(
|
|
onPressed: canGoBack ? () => onPageChanged(currentPage - 1) : null,
|
|
icon: const Icon(Icons.chevron_left),
|
|
tooltip: 'Previous page',
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
|
child: Text(
|
|
'Page ${currentPage + 1}',
|
|
style: Theme.of(context).textTheme.bodyMedium,
|
|
),
|
|
),
|
|
IconButton.outlined(
|
|
onPressed: canGoForward
|
|
? () => onPageChanged(currentPage + 1)
|
|
: null,
|
|
icon: const Icon(Icons.chevron_right),
|
|
tooltip: 'Next page',
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|