refactor: stabilize app bootstrap and polling
This commit is contained in:
@@ -180,12 +180,20 @@ class _HomesScreenState extends ConsumerState<HomesScreen> {
|
||||
|
||||
/// Выбрать дом и перейти на пульт
|
||||
void _selectHome(BuildContext context, HomeConfig home) async {
|
||||
await ref.read(currentHomeProvider.notifier).switchTo(home);
|
||||
await ref.read(authInfoProvider.notifier).load();
|
||||
if (context.mounted) {
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(builder: (_) => const RemoteScreen()),
|
||||
);
|
||||
try {
|
||||
await ref.read(currentHomeProvider.notifier).switchTo(home);
|
||||
await ref.read(authInfoProvider.notifier).load(failOnError: true);
|
||||
if (context.mounted) {
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(builder: (_) => const RemoteScreen()),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
if (context.mounted) {
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(SnackBar(content: Text('Не удалось выбрать дом: $e')));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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('Повторить'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user