/restaurant_menu

Discover our mobile restaurant menu app - a seamless, intuitive way to explore and order delicious culinary delights.

Primary LanguageDart

Restaurant Menu

coverage style: very good analysis License: MIT

Generated by the Very Good CLI πŸ€–

Manage your Menu with ease


Getting Started πŸš€

This project contains 3 flavors:

  • development
  • staging
  • production

To run the desired flavor either use the launch configuration in VSCode/Android Studio or use the following commands:

# Development
$ flutter run --flavor development --target lib/main_development.dart

# Staging
$ flutter run --flavor staging --target lib/main_staging.dart

# Production
$ flutter run --flavor production --target lib/main_production.dart

*Restaurant Menu works on iOS, Android, Web, and Windows.


Project Structure

The project follows a Clean Architecture structure:

β”œβ”€β”€ core
β”œβ”€β”€ feature
β”‚   β”œβ”€β”€ foo
β”‚   β”‚   β”œβ”€β”€ data
β”‚   β”‚   β”œβ”€β”€ domain
β”‚   β”‚   β”œβ”€β”€ presentation

Concepts implemented

  1. Dependency Injection with a custom class ServiceLocator
  2. State Management with Bloc
  3. Navigation with Go Router
  4. Remote database with Firebase Realtime Firebase
  5. Flavors to separate environments
  6. Internationalization
  7. Separation of concerns
  8. Applied SOLID principles and Repository Pattern
  9. Separation of the logic from the UI

Considerations

  • I created a quick prototype of a simple app to show the menu of a restaurant to the client. Is like a Virtual Menu where the user can know the choices of the day.
  • The app was created following best practices to scale it with ease.
  • It can be improved through some iterations with the "business owner" and some designs/features can be added as a result.
  • The structure of the database can be improved with a relational database, and a WebAPI implemented with ASP.Net Core for example, but I choose Firebase for simplicity.
  • I included data_structure.json file in the root of the project, to show how I structured the data
  • I did my best to structure the requirements and make a funcional app.
  • Included some snapshots of the app running in both devices.
  • Included some snapshots of the Firebase Realtime Database

Aspects to consider for a real project

  • Analytics (Firebase, etc)
  • Bug tracking (Firebase, Sentry)
  • Unit, widget, and integration testing
  • Feature Flags
  • CI/CD (Codemagic, Bitrise, Github Actions)
  • etc...

Running Tests πŸ§ͺ

To run all unit and widget tests use the following command:

$ flutter test --coverage --test-randomize-ordering-seed random

To view the generated coverage report you can use lcov.

# Generate Coverage Report
$ genhtml coverage/lcov.info -o coverage/

# Open Coverage Report
$ open coverage/index.html

Working with Translations 🌐

This project relies on flutter_localizations and follows the official internationalization guide for Flutter.

Adding Strings

  1. To add a new localizable string, open the app_en.arb file at lib/l10n/arb/app_en.arb.
{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}
  1. Then add a new key/value and description
{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    },
    "helloWorld": "Hello World",
    "@helloWorld": {
        "description": "Hello World Text"
    }
}
  1. Use the new string
import 'package:restaurant_menu/l10n/l10n.dart';

@override
Widget build(BuildContext context) {
  final l10n = context.l10n;
  return Text(l10n.helloWorld);
}

Adding Supported Locales

Update the CFBundleLocalizations array in the Info.plist at ios/Runner/Info.plist to include the new locale.

    ...

    <key>CFBundleLocalizations</key>
	<array>
		<string>en</string>
		<string>es</string>
	</array>

    ...

Adding Translations

  1. For each supported locale, add a new ARB file in lib/l10n/arb.
β”œβ”€β”€ l10n
β”‚   β”œβ”€β”€ arb
β”‚   β”‚   β”œβ”€β”€ app_en.arb
β”‚   β”‚   └── app_es.arb
  1. Add the translated strings to each .arb file:

app_en.arb

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}

app_es.arb

{
    "@@locale": "es",
    "counterAppBarTitle": "Contador",
    "@counterAppBarTitle": {
        "description": "Texto mostrado en la AppBar de la pΓ‘gina del contador"
    }
}