284299b946
Complete Flutter app (Android + iOS) mirroring the web frontend: - Core: Riverpod state, Dio networking with auth interceptor + auto-refresh, go_router navigation, flutter_secure_storage, light/dark theme with MedievalSharp/Crimson Pro fonts, German l10n - Market: search with text/GPS/radius/date/sort filters, list + map views (flutter_map + OSM), detail screen with opening hours, admission prices, single-marker map, pagination - Auth: login (password + magic link tabs), register, OAuth button placeholders, 2FA code prompt on 401, sealed auth state provider - User: profile view/edit/delete with confirm dialog, 2FA setup/disable on security screen - GPS: geolocator with IP-based fallback (geojs.io) matching web behavior - Platform: Android internet + location permissions, iOS NSLocation description - Tests: date/currency/distance formatter unit tests (13 passing) - Zero analysis issues, debug APK builds successfully
28 lines
841 B
Dart
28 lines
841 B
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import '../../core/providers.dart';
|
|
|
|
class ThemeToggleButton extends ConsumerWidget {
|
|
const ThemeToggleButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final ThemeModeOption mode = ref.watch(themeModeProvider);
|
|
final icon = switch (mode) {
|
|
ThemeModeOption.system => Icons.brightness_auto,
|
|
ThemeModeOption.light => Icons.light_mode,
|
|
ThemeModeOption.dark => Icons.dark_mode,
|
|
};
|
|
|
|
return IconButton(
|
|
icon: Icon(icon),
|
|
onPressed: () => ref.read(themeModeProvider.notifier).cycle(),
|
|
tooltip: switch (mode) {
|
|
ThemeModeOption.system => 'System',
|
|
ThemeModeOption.light => 'Hell',
|
|
ThemeModeOption.dark => 'Dunkel',
|
|
},
|
|
);
|
|
}
|
|
}
|