import 'package:flutter/material.dart'; import 'package:fooder/context.dart'; import 'package:fooder/client.dart'; import 'package:fooder/storage.dart'; import 'package:fooder/components/app_bar.dart'; import 'package:fooder/components/navigation_bar.dart'; import 'package:fooder/screens/login.dart'; import 'package:fooder/screens/main.dart'; TextStyle logoStyle(context) { return Theme.of(context).textTheme.labelLarge!.copyWith( color: Theme.of(context).colorScheme.secondary, ); } abstract class BasedScreen extends StatefulWidget { final Context ctx; const BasedScreen({super.key, required this.ctx}); } abstract class BasedState extends State { Context get ctx => widget.ctx; Client get client => widget.ctx.client; Storage get storage => widget.ctx.storage; void logout() async { await client.api.logout(); backToLogin(); } void backToLogin() { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => LoginScreen(ctx: ctx), ), ); } void backToDiary() { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => MainScreen(ctx: ctx), ), ); } FAppBar appBar() { return FAppBar( actions: [ IconButton( icon: Icon( Icons.logout, color: Theme.of(context).colorScheme.onSurfaceVariant, ), onPressed: logout, ), ], ); } FNavBar navBar() { return FNavBar( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ IconButton( icon: Icon( Icons.menu_book, color: Theme.of(context).colorScheme.onSurfaceVariant, ), onPressed: backToDiary, ), IconButton( icon: Icon( Icons.dinner_dining, color: Theme.of(context).colorScheme.onSurfaceVariant, ), onPressed: () {}, ), IconButton( icon: Icon( Icons.lunch_dining, color: Theme.of(context).colorScheme.onSurfaceVariant, ), onPressed: () {}, ), IconButton( icon: Icon( Icons.person, color: Theme.of(context).colorScheme.onSurfaceVariant, ), onPressed: () {}, ), ], ), ], ); } Future parseDouble(String text, String name, {bool silent = false}) async { try { return double.parse(text.replaceAll(",", ".")); } catch (e) { if (!silent) { showError("$name must be a number"); } return null; } } void showError(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( message, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge!.copyWith( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onError, ), ), backgroundColor: Theme.of(context).colorScheme.error.withOpacity(0.8), ), ); } void showText(String text) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( text, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge!.copyWith( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onPrimary, ), ), backgroundColor: Theme.of(context).colorScheme.primary.withOpacity(0.8), ), ); } }