Files
home_automation_mobile/lib/main.dart
T
cacto 45b8733d22 Каркас приложения: авторизация, зоны/устройства/правила, управление устройствами
HTTP-клиент к /api/v1 с Sanctum-токеном (хранится в secure storage),
модели зеркалят Laravel API Resources. Экраны: логин, список устройств
с живым статусом, детальная страница устройства (история телеметрии,
turn-on/turn-off/set-level с проверкой capability), списки зон и правил
автоматизации (пока только чтение — формы создания/редактирования впереди).
2026-08-12 01:12:39 +05:00

54 lines
1.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'core/api_client.dart';
import 'core/api_service.dart';
import 'core/auth_service.dart';
import 'screens/home_screen.dart';
import 'screens/login_screen.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
final apiClient = ApiClient();
return MultiProvider(
providers: [
Provider<ApiClient>.value(value: apiClient),
Provider<ApiService>(create: (_) => ApiService(apiClient)),
ChangeNotifierProvider<AuthService>(
create: (_) => AuthService(apiClient)..restoreSession(),
),
],
child: MaterialApp(
title: 'Домашняя автоматизация',
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal)),
home: const AuthGate(),
),
);
}
}
/// Swaps between login and the app shell based on session state, so nothing
/// else in the tree needs to know how auth is restored or persisted.
class AuthGate extends StatelessWidget {
const AuthGate({super.key});
@override
Widget build(BuildContext context) {
final auth = context.watch<AuthService>();
if (auth.isLoading) {
return const Scaffold(body: Center(child: CircularProgressIndicator()));
}
return auth.isAuthenticated ? const HomeScreen() : const LoginScreen();
}
}