documentation version 1.0
Foodlay UI Kit is a modern, comprehensive, and beautifully designed Flutter UI template specially crafted for food delivery businesses and startups.
This powerful UI kit includes two complete applications in a single package:
Built entirely with Flutter, Foodlay delivers pixel-perfect, responsive, and smooth user interfaces that work flawlessly on both Android and iOS platforms from a single codebase.
Customer App – key features
Customer App – basic usage
Deliveryman App – key features
Deliveryman App – basic usage
Whether you're building the next big food delivery platform, creating a local restaurant aggregator, or launching a quick MVP — Foodlay helps you save hundreds of hours of design and frontend development time.
Start building your dream food delivery experience today with Foodlay UI Kit.
Before you begin working with Foodlay UI Kit — the complete Flutter solution containing both the Customer App and Deliveryman App — please ensure your development environment meets the following requirements. This will help you avoid common setup issues and allow you to run, customize, and build the projects smoothly.
Flutter is Google's free and open-source UI software development toolkit for crafting high-performance, natively compiled applications for mobile (iOS & Android), web, desktop, and embedded devices — all from a single codebase.
Released in 2017 and reaching full maturity by 2026, Flutter has become one of the most popular cross-platform frameworks thanks to:
Foodlay UI Kit is built entirely with the latest stable Flutter 3.38.x (as of January 2026), ensuring modern features, optimal performance, and long-term compatibility for your food delivery Customer App and Deliveryman App.
Whether you're a beginner or an experienced developer, Flutter makes it fast and enjoyable to create stunning, responsive user interfaces like the ones included in Foodlay.
To work efficiently with Foodlay UI Kit, prepare the following essential tools:
Required
Recommended IDE / Editor
The most popular and fully supported options are:
Additional Platform Tools
After installation, always validate your setup by running:
flutter doctor
Resolve any reported issues (especially Android licenses, Xcode tools, etc.) before opening the Foodlay project.
Follow these professional steps to get Flutter fully working in Android Studio on Windows:
Install Android Studio
Download the latest version from:
https://developer.android.com/studio
Run the installer and follow the wizard (install Android SDK, emulator, etc.).
Download & extract Flutter SDK
Go to https://docs.flutter.dev/install
Download the latest stable ZIP (e.g.,
flutter_windows_3.38.6-stable.zip)
Extract to a permanent location, e.g.:
C:\src\flutter (avoid paths with spaces).
Update system PATH
Search for "Environment Variables" in Windows Search and edit the
Path
variable under System variables. Add:
C:\src\flutter\bin
Click OK and restart your terminal / PowerShell.
Install Flutter & Dart plugins in Android Studio
In Android Studio: File → Settings → Plugins
Search and install Flutter (this automatically installs Dart), then
restart Android Studio when prompted.
Let Android Studio locate Flutter SDK
Go to File → Settings → Languages & Frameworks → Flutter
Set Flutter SDK path to your extraction folder (e.g.,
C:\src\flutter)
and click Apply / OK.
Run Flutter Doctor
flutter doctor
flutter doctor --android-licenses
Create / test a project (optional verification):
flutter create my_test_app
cd my_test_app
flutter run
You're now ready to open and run Foodlay projects on Windows!
macOS setup is streamlined and perfect for iOS + Android development:
Install Android Studio
Download from
https://developer.android.com/studio,
drag to the Applications folder and launch.
Download & extract Flutter SDK
Visit https://docs.flutter.dev/install
Download the macOS stable ZIP and extract to e.g.:
~/development/flutter.
Update PATH
Open Terminal and edit your shell config (zsh is default in recent macOS):
nano ~/.zshrc
export PATH="$PATH:`pwd`/development/flutter/bin"
source ~/.zshrc
Install Flutter & Dart plugins
In Android Studio: Android Studio → Preferences → Plugins
Install Flutter (includes Dart) and restart.
Configure Flutter SDK in Android Studio
Preferences → Languages & Frameworks → Flutter
Set Flutter SDK path (e.g.,
/Users/yourname/development/flutter) and apply changes.
Install Xcode (for iOS)
App Store → search "Xcode" → install latest (16+).
Open Xcode once and accept the license.
Install Command Line Tools
xcode-select --install
sudo gem install cocoapods
pod setup
Final checks
flutter doctor
flutter doctor --android-licenses
Now launch Foodlay apps on simulators / devices from Android Studio on macOS!
Linux setup (Ubuntu 22.04+, Fedora, etc.) is clean and efficient:
Install Android Studio
Download from the official site or use Snap:
sudo snap install android-studio --classic
Download & extract Flutter SDK
Go to https://docs.flutter.dev/install
Download the stable tarball and extract:
mkdir -p ~/development
tar xf flutter_linux_3.38.6-stable.tar.xz -C ~/development
Update PATH
Edit ~/.bashrc or ~/.zshrc:
nano ~/.bashrc
export PATH="$PATH:$HOME/development/flutter/bin"
source ~/.bashrc
Install dependencies (Ubuntu example):
sudo apt update
sudo apt install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
sudo nano /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
sudo udevadm control --reload-rules && sudo service udev restart
Flutter & Dart plugins in Android Studio
Launch Android Studio → File → Settings → Plugins → install Flutter → restart
IDE.
Set Flutter SDK path
Settings → Languages & Frameworks → Flutter
Point to ~/development/flutter and apply.
Verify & accept licenses
flutter doctor
flutter doctor --android-licenses
You're set! Open Foodlay UI Kit folders in Android Studio and start building beautiful food delivery apps on Linux.
List connected devices and run on a specific target:
flutter devices
flutter run -d <device_id>
Verify Android devices visibility:
adb devices
Welcome to the Getting Started section of Foodlay UI Kit.
This guide walks you through the essential steps to open, configure, build, and launch both the Customer App and Deliveryman App on your device or emulator.
Foodlay is structured as two separate Flutter applications. The process is nearly identical for both — just make sure to work inside the correct project folder.
customer_app/
deliveryman_app/
Use File → Open and select the app folder.
flutter pub get
This downloads and installs all required packages listed in
pubspec.yaml.
pubspec.yaml and click the Pub get button.
adb devices. iOS — install
Xcode and use Simulator, or trust the device via Xcode’s
Devices and Simulators.
From terminal (alternative method):
# Customer app
cd customer_app
flutter pub get
flutter run
# Deliveryman app
cd ../deliveryman_app
flutter pub get
flutter run
# List devices and run on a specific target
flutter devices
flutter run -d <device_id>
res/values/secrets.xml,
iOS: Info.plist).
For signing and publishing, see the Android/iOS release checklists under Advanced configuration.
This section guides you through essential customization steps to rebrand and prepare your Foodlay applications (Customer App and Deliveryman App) for production. These changes include updating the app name (display label), launcher icon, application ID (Android package name), and bundle identifier (iOS).
Recommendation: For faster and error-free results, consider using popular Flutter packages such as:
flutter_launcher_icons — automatic icon generation and
replacement.rename or change_app_package_name — bulk renaming
of
app name and bundle / package ID across platforms.Install them globally or per-project as needed (see pub.dev for the latest instructions).
Open the Android module in Android Studio
android folder inside your app
directory
(for example customer_app/android or
deliveryman_app/android).
File → Sync Project with Gradle Files).
The display name appears on the device home screen and app drawer.
android/app/src/main/AndroidManifest.xml.<application> tag.android:label attribute, for example:android:label="Foodlay Customer" // or your desired name
flutter_launcher_icons package.
ic_launcher.png or follow adaptive icon structure if using
newer
formats):
android/app/src/main/res/mipmap-hdpi/
android/app/src/main/res/mipmap-mdpi/
android/app/src/main/res/mipmap-xhdpi/
android/app/src/main/res/mipmap-xxhdpi/
android/app/src/main/res/mipmap-xxxhdpi/
For adaptive icons (Android 8.0+), also update
mipmap-anydpi-v26/ic_launcher.xml if present.
After replacement, run:
flutter clean
flutter pub get
Then rebuild the app.
The package name is unique and used for Google Play identification.
android/app/build.gradle.kts.defaultConfig block, update:applicationId = "com.example.flutter_boilerplate" // Customer app
applicationId = "com.foodly.deliveryman" // Deliveryman app
Use reverse domain notation, for example:
com.yourcompany.foodlay.delivery for the Deliveryman app.
If using Firebase or Google Maps, also update:
google-services.json (download a new file from Firebase Console
with the updated package name).Note: changing the package name requires a full clean rebuild and may affect existing installations. Uninstall the old version from devices before installing the new one.
android/app/build.gradle.kts.
keytool -genkey -v -keystore ~/foodlay-release.keystore -alias foodlay \
-keyalg RSA -keysize 2048 -validity 10000
Open your Flutter project in Xcode
ios folder (for example
customer_app/ios/Runner.xcworkspace).
Runner.xcworkspace to launch Xcode.Foodlay.
The bundle ID uniquely identifies your app on the App Store.
com.thedayone.foodlay.customer
(The value must match what you register in App Store Connect.)
Important: update any associated provisioning profiles, certificates, and capabilities (for example, Push Notifications, Maps) after changing the Bundle ID.
Typical layout of the two apps:
customer_app/ — Android, iOS, lib, assetsdeliveryman_app/ — Android, iOS, lib, assetslib/config/route/route_config.dart — central route definitions
lib/core/dependency_injection/ — get_it + injectable setuplib/config/theme/ — light/dark themes and custom colorslib/config/util/ — constants, assets.gen.dart, fonts.gen.dart,
styleslib/features/<feature>/presentation/screens/ — feature
screenslib/features/<feature>/presentation/widgets/ —
feature-private widgetsassets/ — images, icons, etc.; pubspec.yaml —
dependencies and assetsFor renaming and branding, see Android configuration and iOS configuration sections above.
Both apps ship with a local mock API for rapid UI development and a clean path to connect a real backend when ready.
shelf +
shelf_router, starts during app initialization via dependency
injection.
8080; Deliveryman →
8081.
AppConstants.baseUrl and
injected into ApiClient via @Named('appBaseUrl').
# Customer
lib/core/mock/mock_api_server.dart # port 8080
lib/config/util/app_constants.dart # baseUrl = 'http://localhost:8080'
# Deliveryman
lib/core/mock/mock_api_server.dart # port 8081
lib/config/util/app_constants.dart # baseUrl = 'http://localhost:8081'
# DI entry
lib/core/dependency_injection/dependency_injection.dart
lib/core/dependency_injection/dependency_module.dart
AppConstants.baseUrl pointing to
http://localhost:<port> (per app).
assets/mock_data/ and is wired via
Assets.mockData.* (generated by flutter_gen).
lib/core/mock/mock_api_server.dart:
router.get(AppConstants.itemsUri,
(req) => _handleRequestWithFile(req, Assets.mockData.items));
AppConstants.baseUrl to your API endpoint
(e.g., https://api.yourdomain.com).// lib/main.dart
await configureDependencies(env: Environment.prod);
ApiClient attaches Content-Type,
Authorization: Bearer <token>, and locale headers.
X-User-ID when available; Deliveryman
adds
zoneid.
SharedPreferences keys (see
AppConstants.token, language_code).
AppLocalizations in
lib/main.dart (delegates, supported locales, and
locale).
lib/l10n/arb/ (e.g.
app_en.arb, app_ar.arb, app_bn.arb,
app_es.arb, app_hi.arb).
context.l10n from
lib/l10n/l10n.dart.
LocalizationBloc and persisted
via
CommonServiceInterface.
EdgeInsetsDirectional,
AlignmentDirectional) and verify on RTL devices.
lib/config/theme/light_theme.dart and
dark_theme.dart to customize ThemeData.
CustomThemeColors (theme extensions) to manage a global
color
palette.pubspec.yaml and set
fontFamily in theme files.
ThemeBloc and persisted via
CommonServiceInterface.
assets/; use
flutter_launcher_icons for app icons.
Android: add your Google Maps API key to AndroidManifest.xml:
<application>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_ANDROID_API_KEY"/>
</application>
iOS: add your API key to ios/Runner/Info.plist:
<key>GMSApiKey</key>
<string>YOUR_IOS_API_KEY</string>
Best practices:
google_maps_flutter; see map helpers for bounds
and
settings:
lib/core/helper/map_bound_helper.dart (Customer) and
lib/core/helper/google_map_setting_bound.dart (Deliveryman).
Enable APIs and create keys:
Get SHA-1 fingerprints:
# Debug keystore
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android
# Release keystore
keytool -list -v -alias foodlay -keystore ~/foodlay-release.keystore
test/.
integration_test/.
Run unit and widget tests:
flutter test
Run integration tests (ensure a device/emulator is ready):
flutter test integration_test
The Widget copy flow lets you duplicate any existing
reusable
widget (e.g., RestaurantCard, QuantitySelector)
into
another location or into the second app (Customer ↔ Deliveryman) without
breaking theming or state management.
lib/common/presentation/widgets/ or inside
a
feature folder
such as lib/features/<feature>/presentation/widgets/.
restaurant_card.dart → grocery_card.dart).
import '../../core/theme/app_colors.dart';).
lib/common/presentation/widgets/widgets.dart
or
lib/features/<feature>/presentation/widgets/widgets.dart).
export 'grocery_card.dart';
import 'package:flutter_boilerplate/common/presentation/widgets/grocery_card.dart';
Column/ListView.
The Screen copy flow allows you to duplicate an entire screen (page/route) including its bloc, repository, and UI files. This is useful when you want a new flow that resembles an existing one (e.g., copy “Restaurant Details” to create “Grocery Details”).
lib/features/<feature>/presentation/ (e.g.,
lib/features/restaurant_details/presentation/screens/).
view/ (UI layer)cubit/ or bloc/ (state management)
repository/ (data source)model/ (data classes)features/ → Paste.grocery_details).RestaurantDetailsPage →
GroceryDetailsPage
RestaurantDetailsCubit →
GroceryDetailsCubit
RestaurantDetailsRepository →
GroceryDetailsRepository
lib/config/route/route_config.dart.
// 1) Add a route constant
static const String groceryDetails = 'grocery_details';
// 2) Register the route in GoRouter
GoRoute(
path: groceryDetails.pathUrl,
builder: withRouteContext((context, state) => const GroceryDetailsPage()),
pageBuilder: GoTransitions.fade.call,
),
get_it with injectable annotations.@injectable (and add any
@module bindings in
lib/core/dependency_injection/dependency_module.dart if
needed).
flutter pub run build_runner build --delete-conflicting-outputs
At startup, DI is initialized via
configureDependencies() in
lib/core/dependency_injection/dependency_injection.dart, so no
manual registration calls are required.
flutter clean to clear old build cache.flutter pub get to refresh dependencies.ProviderNotFoundException at runtime. Always
double-check the injection setup.
lib/features/<feature>/data/repositories/ and update
any
calls in
lib/core/data/api/ as appropriate.
Once these steps are complete, you have a fully independent screen that can evolve separately from the original. Repeat the flow for any additional screens you need to duplicate.
Create a release keystore:
keytool -genkey -v -keystore ~/foodlay-release.keystore -alias foodlay -keyalg RSA -keysize 2048 -validity 10000
Create key.properties in the android folder:
storeFile=/Users/yourname/foodlay-release.keystore
storePassword=YOUR_PASSWORD
keyAlias=foodlay
keyPassword=YOUR_PASSWORD
Configure signing in android/app/build.gradle.kts:
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = java.util.Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(java.io.FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
isShrinkResources = true
}
}
}
versionCode and versionName in
android/app/build.gradle.kts:
android {
defaultConfig {
applicationId = "com.example.flutter_boilerplate"
minSdk = 21
targetSdk = 34
versionCode = 2
versionName = "1.1.0"
}
}
flutter build appbundle
flutter build apk --release
Configure signing and required capabilities in Xcode:
Xcode will automatically handle size variations.
Product → Clean Build Folder.
flutter clean
flutter pub get
Then rebuild and run:
flutter run
These customizations ensure your Foodlay apps reflect your brand identity across both platforms. Always test thoroughly on physical devices after changes, especially icons and identifiers.
ios/Runner/Info.plist:<key>CFBundleShortVersionString</key>
<string>1.1.0</string>
<key>CFBundleVersion</key>
<string>3</string>
flutter build ios --release
Any iOS Device (arm64),
then
Product → Archive.
This section provides a professional, end-to-end guide for developing with mock data and integrating real APIs for both Foodlay applications (Customer and Deliveryman).
Key files:
customer_app/lib/core/mock/mock_api_server.dart
deliveryman_app/lib/core/mock/mock_api_server.dart
customer_app/lib/config/util/app_constants.dart
deliveryman_app/lib/config/util/app_constants.dart
customer_app/lib/core/dependency_injection/dependency_injection.dart
customer_app/lib/core/data/api/api_client.dart
deliveryman_app/lib/core/data/api/api_client.dart
http://localhost:8080http://localhost:8081localhost points to
the device itself (no emulator bridging required).AppConstants.baseUrl pointed to the local port.assets/mock_data/ and referenced via
Assets.mockData.*.
router.get(AppConstants.itemsUri,
(req) => _handleRequestWithFile(req, Assets.mockData.items));
flutter pub run build_runner build to regenerate DI and assets
code when necessary.AppConstants.baseUrl to your API host (e.g.,
https://api.yourdomain.com).
// in main.dart
await configureDependencies(env: Environment.prod);
Authorization, locale, and
optionally X-User-ID.Authorization, locale
SharedPreferences (see keys in
AppConstants).
curl to hit local routes directly:
curl http://localhost:8080/api/v1/customer/app-screen/home
curl http://localhost:8081/api/v1/deliveryman/orders
Even with a well-structured Flutter project like Foodlay UI Kit (containing both the Customer App and Deliveryman App), you might encounter build, dependency, or runtime errors — especially during initial setup, after Flutter/Dart upgrades, or when switching platforms.
This section covers the most frequently reported issues developers face with Foodlay-style Flutter UI kits, along with clear, step-by-step solutions (updated for Flutter 3.38.x in January 2026).
Typical symptoms:
Common causes:
Quick fixes:
# Accept all licenses
flutter doctor --android-licenses
# Clean Android Gradle project
cd android
./gradlew clean
cd ..
# Delete Flutter caches & rebuild
flutter clean
flutter pub get
flutter pub cache repair # optional but powerful
# Run again
flutter run
Symptoms: IDE shows a red error or flutter commands
fail.
Fix:
bin directory is in your system
PATH.
C:\flutter or
~/development/flutter).
Symptoms: flutter pub get shows conflict errors
such as
"Because package A depends on package B ^1.0.0 which doesn't match any
versions".
Solutions:
flutter pub get --no-version-check
pubspec.yaml to compatible versions.
flutter pub upgrade --major-versions
pubspec.lock and resolve fresh:rm -f pubspec.lock
flutter pub get
Symptoms: Errors like
IPHONEOS_DEPLOYMENT_TARGET is set to x.x, but the range is 9.0 to 16.0
(or similar).
Cause: Mismatch between the project deployment target and CocoaPods / Podfile settings.
Fix:
ios/Podfile.platform :ios, '13.0' # or '14.0', '15.0' etc. — match your needs
Then run:
cd ios
pod deintegrate
pod cache clean --all
pod install --repo-update
cd ..
flutter clean
flutter pub get
Cause: The Google services configuration (for example
google-services.json) has a different package name to your Android
app
ID.
Fix:
android/app/google-services.json and check
package_name.
applicationId in
android/app/build.gradle.kts (e.g.,
com.example.flutter_boilerplate for Customer,
com.foodly.deliveryman for Deliveryman).
Cause: Flutter requires newer Android Gradle Plugin (AGP) and Gradle versions.
Fix:
android/build.gradle, update the Android Gradle Plugin
classpath, for example:dependencies {
classpath 'com.android.tools.build:gradle:8.5.0' // or latest compatible
}
android/gradle/wrapper/gradle-wrapper.properties, update the
distribution URL, for example:distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip
Use a Gradle version compatible with your AGP and Flutter version.
Cause: Missing imports, outdated generated files, or an
incomplete
flutter pub get.
Fix:
rm -rf .dart_tool/
rm -rf build/
flutter clean
flutter pub get
If you use code generators (for example freezed,
json_serializable), also run:
flutter pub run build_runner build --delete-conflicting-outputs
When in doubt, start with a clean rebuild. This checklist solves most local environment issues:
flutter clean
rm -f pubspec.lock # optional but often helpful
flutter pub get
flutter pub cache repair
cd android && ./gradlew clean && cd ..
cd ios && pod install # if on macOS, with CocoaPods installed
flutter run --verbose
Most issues in Foodlay are resolved with a clean + fresh
flutter pub get cycle. If problems persist, check your Flutter
version
(flutter --version), ensure you're on the stable
channel, and verify that flutter doctor reports no major issues.
Symptoms: Emulator cannot access internet or API; proxy or VPN interference.
Fix:
export no_proxy=127.0.0.1,localhost
export NO_PROXY=127.0.0.1,localhost
Symptoms: Empty lists, 404s from localhost, or "Unable
to connect to server".
Fix:
MockApiServer (it’s a singleton).
AppConstants.baseUrl:
http://localhost:8080http://localhost:8081android:networkSecurityConfig="@xml/network_security_config";
ensure the file permits localhost for development.
localhost as shown above.Symptoms: Errors like "Target of URI does not exist:
app_localizations.dart", missing assets.gen.dart,
dependency_injection.config.dart, or
*.freezed.dart/*.g.dart.
Fix:
flutter clean
flutter pub get
flutter pub run build_runner build --delete-conflicting-outputs
flutter_gen_runner, freezed,
json_serializable, and injectable_generator are
present in dev_dependencies (both apps include them).
flutter: generate: true is set in
pubspec.yaml.
flutter devices, accept trust prompts (Android USB
debugging; iOS trust computer). Re-run flutter run.pod cache clean --all, pod install --repo-update,
verify xcode-select --install.
flutter clean only when necessary, then
flutter pub get.
We’re committed to helping you get the most out of Foodlay UI Kit — your complete Flutter solution for building professional Customer and Deliveryman food delivery applications.
Before reaching out, please review the full documentation: Prerequisites, Quick Start, Advanced Configuration, and Common Issues & Troubleshooting. Most setup, build, and customization questions can be resolved quickly using the provided guides and code comments.
flutter --version)Support covers:
We do not provide support for:
Requests are handled on a first-come, first-served basis. Typical response time is 24–72 hours (business days).
Thank you for choosing Foodlay UI Kit. We’re excited to support you on your journey to launching a beautiful, high-performance food delivery platform.