Riverpod + go_router с auth-guard, NavigationRail на широком экране и bottom bar на узком. Токены в flutter_secure_storage, на web access живёт в памяти. Интерцептор подставляет токен и делает ровно один refresh на 401. Деньги приходят строками и форматируются через Decimal: парсить их в double значило бы терять копейки ровно там, где бэкенд их бережёт.
31 lines
1006 B
Dart
31 lines
1006 B
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'core/theme/theme_controller.dart';
|
|
import 'router.dart';
|
|
|
|
class FinTrackerApp extends ConsumerWidget {
|
|
const FinTrackerApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final router = ref.watch(routerProvider);
|
|
final themeMode = ref.watch(themeModeProvider);
|
|
return MaterialApp.router(
|
|
title: 'fin-tracker',
|
|
routerConfig: router,
|
|
themeMode: themeMode,
|
|
theme: ThemeData(colorSchemeSeed: const Color(0xFF2E6F5E), useMaterial3: true),
|
|
darkTheme: ThemeData(
|
|
colorSchemeSeed: const Color(0xFF2E6F5E),
|
|
brightness: Brightness.dark,
|
|
useMaterial3: true,
|
|
),
|
|
locale: const Locale('ru'),
|
|
supportedLocales: const [Locale('ru'), Locale('en')],
|
|
localizationsDelegates: GlobalMaterialLocalizations.delegates,
|
|
);
|
|
}
|
|
}
|