2025-11-17 11:51:42 +03:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
2025-01-21 14:24:31 +03:00
|
|
|
|
import 'package:flutter/material.dart';
|
2025-09-26 08:21:42 +03:00
|
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
2025-04-27 17:08:34 +03:00
|
|
|
|
import 'package:friflex_starter/app/app_context_ext.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/debug/debug_routes.dart';
|
2025-09-26 08:21:42 +03:00
|
|
|
|
import 'package:friflex_starter/features/update/domain/state/cubit/update_cubit.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/update/presentation/components/soft_modal_sheet.dart';
|
2025-01-21 14:24:31 +03:00
|
|
|
|
import 'package:go_router/go_router.dart';
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template root_screen}
|
|
|
|
|
|
/// Корневой экран приложения с навигационной структурой.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Отвечает за:
|
|
|
|
|
|
/// - Отображение основного навигационного интерфейса
|
|
|
|
|
|
/// - Управление переключением между основными разделами приложения
|
|
|
|
|
|
/// - Отображение кнопки отладки в не-продакшн окружениях
|
|
|
|
|
|
/// - Интеграцию с GoRouter для навигации
|
|
|
|
|
|
/// {@endtemplate}
|
2025-09-26 08:21:42 +03:00
|
|
|
|
class RootScreen extends StatefulWidget {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro root_screen}
|
2025-05-28 16:38:56 +03:00
|
|
|
|
const RootScreen({required this.navigationShell, super.key});
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Текущая ветка навигации от GoRouter
|
|
|
|
|
|
/// Содержит информацию о текущем состоянии навигации
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final StatefulNavigationShell navigationShell;
|
|
|
|
|
|
|
2025-09-26 08:21:42 +03:00
|
|
|
|
@override
|
|
|
|
|
|
State<RootScreen> createState() => _RootScreenState();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class _RootScreenState extends State<RootScreen> {
|
|
|
|
|
|
@override
|
|
|
|
|
|
void initState() {
|
|
|
|
|
|
super.initState();
|
|
|
|
|
|
// После построения виджета, проверяем состояние кубита обновлений
|
|
|
|
|
|
// и если есть обновление, то показываем модальное окно
|
|
|
|
|
|
_checkSoftUpdate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Проверяет состояние кубита обновлений и показывает модальное окно при наличии мягкого обновления
|
|
|
|
|
|
void _checkSoftUpdate() {
|
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
|
final updateState = context.read<UpdateCubit>().state;
|
|
|
|
|
|
|
|
|
|
|
|
// Проверяем только состояние успеха с доступной информацией об обновлении
|
|
|
|
|
|
if (updateState is UpdateSuccessState &&
|
2025-11-17 12:49:07 +03:00
|
|
|
|
updateState.updateInfo.updateType == .soft) {
|
2025-11-17 11:51:42 +03:00
|
|
|
|
unawaited(
|
|
|
|
|
|
SoftUpdateModal.show(
|
|
|
|
|
|
context,
|
|
|
|
|
|
updateEntity: updateState.updateInfo,
|
|
|
|
|
|
onUpdate: () {
|
|
|
|
|
|
// TODO(yura): реализовать логику обновления приложения
|
|
|
|
|
|
},
|
|
|
|
|
|
),
|
2025-09-26 08:21:42 +03:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-01-21 14:24:31 +03:00
|
|
|
|
@override
|
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
|
return Scaffold(
|
2025-11-17 12:49:07 +03:00
|
|
|
|
floatingActionButton: context.di.env != .prod
|
2025-04-27 17:08:34 +03:00
|
|
|
|
? FloatingActionButton(
|
|
|
|
|
|
child: const Icon(Icons.bug_report),
|
|
|
|
|
|
onPressed: () {
|
2025-11-17 11:51:42 +03:00
|
|
|
|
unawaited(context.pushNamed(DebugRoutes.debugScreenName));
|
2025-04-27 17:08:34 +03:00
|
|
|
|
},
|
|
|
|
|
|
)
|
|
|
|
|
|
: null,
|
2025-09-26 08:21:42 +03:00
|
|
|
|
body: widget.navigationShell,
|
2025-01-21 14:24:31 +03:00
|
|
|
|
bottomNavigationBar: BottomNavigationBar(
|
|
|
|
|
|
items: const <BottomNavigationBarItem>[
|
2025-06-20 16:50:48 +03:00
|
|
|
|
BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Главная'),
|
2025-04-27 17:08:34 +03:00
|
|
|
|
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Профиль'),
|
2025-01-21 14:24:31 +03:00
|
|
|
|
],
|
2025-09-26 08:21:42 +03:00
|
|
|
|
currentIndex: widget.navigationShell.currentIndex,
|
|
|
|
|
|
onTap: widget.navigationShell.goBranch,
|
2025-01-21 14:24:31 +03:00
|
|
|
|
),
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|