refactor: stabilize app bootstrap and polling

This commit is contained in:
Artem Kokos
2026-04-22 23:37:15 +07:00
parent 7c0a2675c6
commit 762d16dc78
5 changed files with 353 additions and 59 deletions

View File

@@ -19,23 +19,22 @@ class RemoteScreen extends ConsumerStatefulWidget {
}
class _RemoteScreenState extends ConsumerState<RemoteScreen> {
bool _loading = true;
@override
void initState() {
super.initState();
_bootstrap();
Future.microtask(() => ref.read(groupsProvider.notifier).startPolling());
}
Future<void> _bootstrap() async {
await ref.read(groupsProvider.notifier).initAndRefresh();
await ref.read(authInfoProvider.notifier).load();
if (mounted) setState(() => _loading = false);
@override
void dispose() {
ref.read(groupsProvider.notifier).stopPolling();
super.dispose();
}
@override
Widget build(BuildContext context) {
final groups = ref.watch(groupsProvider);
final groupsLoadState = ref.watch(groupsLoadStateProvider);
final currentHome = ref.watch(currentHomeProvider);
final authInfo = ref.watch(authInfoProvider);
final isAdmin = authInfo?['is_admin'] == true;
@@ -124,7 +123,7 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
),
],
),
body: _loading
body: groupsLoadState.isLoading && groups.isEmpty
? const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@@ -138,6 +137,8 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
],
),
)
: groupsLoadState.hasError && groups.isEmpty
? _GroupsErrorView(message: groupsLoadState.errorMessage)
: groups.isEmpty
? Center(
child: Column(
@@ -241,3 +242,48 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
}
}
}
class _GroupsErrorView extends ConsumerWidget {
final String? message;
const _GroupsErrorView({this.message});
@override
Widget build(BuildContext context, WidgetRef ref) {
return Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(
Icons.wifi_off_rounded,
size: 64,
color: Colors.deepOrange,
),
const SizedBox(height: 16),
const Text(
'Не удалось загрузить группы',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white70, fontSize: 16),
),
if (message != null) ...[
const SizedBox(height: 8),
Text(
message!,
textAlign: TextAlign.center,
style: const TextStyle(color: Colors.white38, fontSize: 12),
),
],
const SizedBox(height: 16),
FilledButton.icon(
onPressed: () => ref.read(groupsProvider.notifier).refresh(),
icon: const Icon(Icons.refresh),
label: const Text('Повторить'),
),
],
),
),
);
}
}