🍕 Pizza Mart
Универсальный Flutter шаблон мобильного приложения для ресторана, кафе или бара. Настраивается под любое заведение за 15 минут через один конфигурационный файл.
Скриншот главного экрана приложения
Что включено
Главная
Баннер, галерея, новости, контакты
PDF Меню
Встроенный просмотрщик PDF файлов
Бронирование
Форма → уведомление в Telegram
Новости
Загружаются с WordPress сайта
Галерея
Фото из WordPress медиафайлов
Контакты
Телефон, адрес, карта, соцсети
Push уведомления
Firebase Cloud Messaging
Онбординг
3 экрана при первом запуске
Экраны приложения
Онбординг — три экрана при первом запуске
Онбординг 1
Онбординг 2
Онбординг 3
Главная и бронирование
Главная 1
Главная 2
Бронь столика
Меню, новости, контакты
Меню
Новости
Страница новостей
Контакты
⚙️ Требования
Перед началом работы убедитесь что на вашем компьютере установлено всё необходимое.
Требования к хостингу (для новостей и галереи)
Если вы хотите использовать новости и галерею в приложении, вам нужен хостинг с WordPress. Если новости и галерея не нужны — хостинг не обязателен.
| Требование | Минимум | Рекомендуется |
|---|---|---|
| PHP | 7.4+ | 8.1+ |
| MySQL | 5.7+ | 8.0+ |
| WordPress | 5.0+ | 6.0+ |
| SSL сертификат | Обязательно (HTTPS) | Let's Encrypt (бесплатно) |
| Дисковое пространство | 1 ГБ | 5+ ГБ |
| REST API WordPress | Включён по умолчанию | — |
Если хостинг не нужен — оставьте wordpressUrl = '' в конфиге. Разделы новостей и галереи автоматически скроются.
Необходимые инструменты
| Инструмент | Версия | Ссылка |
|---|---|---|
| Flutter SDK | 3.41.6 и выше | flutter.dev |
| Android Studio | 2024.1+ | developer.android.com |
| Dart SDK | 3.9.0+ | Входит в Flutter |
| Java JDK | 17+ | adoptium.net |
| Git | Любая | git-scm.com |
Установка Flutter
Скачайте Flutter SDK
Перейдите на flutter.dev и скачайте Flutter SDK для Windows.
Распакуйте архив
Распакуйте в папку без пробелов и специальных символов, например C:\flutter
Добавьте в PATH
Добавьте C:\flutter\bin в системную переменную PATH.
Проверьте установку
flutter doctor
Все пункты должны быть отмечены зелёной галочкой ✓
Если flutter doctor показывает ошибки — следуйте инструкциям в выводе команды для их исправления.
🚀 Быстрый старт
Запустите приложение за несколько минут.
Распакуйте архив
Распакуйте скачанный архив с исходниками в удобную папку.
Установите зависимости
В терминале Android Studio выполните:
flutter pub get
Запустите эмулятор или подключите телефон
В Android Studio выберите устройство в выпадающем списке вверху.
Приложение запущено. Теперь настройте его под ваше заведение в файле lib/config/app_config.dart
📁 Структура проекта
Обзор файлов и папок проекта.
Всё что нужно для настройки приложения находится в lib/config/app_config.dart. Вам не нужно редактировать другие файлы для базовой настройки.
🔧 Настройка app_config.dart
Главный файл конфигурации. Здесь настраивается всё приложение — название, контакты, цвета, меню и многое другое.
Путь к файлу: lib/config/app_config.dart
Основное
dart// Название заведения (отображается в приложении)
static const String appName = 'Pizza Mart';
// Подзаголовок на главной странице
static const String appTagline = 'Вкусная еда с доставкой';
Контакты
static const String phone = '+7 999 000 00 00';
static const String whatsapp = '79990000000'; // без + и пробелов
static const String address = 'г. Москва, ул. Примерная, д. 1';
static const String workingHours = 'Ежедневно с 10:00 до 23:00';
static const String instagram = 'https://www.instagram.com/ваш_аккаунт';
static const String dzen = 'https://dzen.ru/ваш_канал'; // пусто если нет
Координаты на карте
// Найдите координаты на Яндекс Картах
static const double mapLat = 55.751244; // широта
static const double mapLng = 37.618423; // долгота
Откройте Яндекс Карты → найдите ваш адрес → нажмите правой кнопкой на точку → скопируйте координаты.
Баннер на главной
// Прямая ссылка на изображение (рекомендуемый размер 1200x800 px)
static const String heroBannerUrl = 'https://ваш-сайт.ru/banner.jpg';
Бронирование
// Текст о депозите (оставьте пустым если депозит не нужен)
static const String bookingDepositInfo = 'Депозит 1000 ₽ с человека';
// Отключить раздел бронирования
static const bool bookingEnabled = false;
Социальные сети в контактах
static const bool showWhatsApp = true;
static const bool showInstagram = true;
static const bool showDzen = false;
🎨 Иконки меню
В приложении используется библиотека Font Awesome с тысячами иконок для разделов меню.
Как найти иконку
Откройте сайт Font Awesome
Перейдите на fontawesome.com/icons
Выберите бесплатную иконку
Фильтруйте по Free — только они доступны без подписки.
Скопируйте название
Нажмите на иконку и скопируйте её название, например pizza-slice
Как использовать в app_config.dart
Добавьте префикс fa_ и замените дефисы на подчёркивания:
| Название на fontawesome.com | В app_config.dart |
|---|---|
pizza-slice | fa_pizza |
burger | fa_burger |
martini-glass | fa_martini |
bowl-food | fa_bowl |
mug-hot | fa_mug |
При добавлении иконки которой нет в готовом списке нужно добавить её в двух местах:
Место 1 — в app_config.dart:
'icon': 'fa_salad',
Место 2 — в lib/screens/menu_screen.dart в метод _getFaIcon():
case 'fa_salad': return FontAwesomeIcons.leaf;
Готовые иконки
Эти иконки уже добавлены и работают без дополнительных изменений:
| Код | Описание | Код | Описание |
|---|---|---|---|
fa_pizza | 🍕 Пицца | fa_burger | 🍔 Бургер |
fa_martini | 🍸 Мартини | fa_bowl | 🥣 Миска |
fa_ice_cream | 🍦 Мороженое | fa_mug | ☕ Кружка |
fa_fish | 🐟 Рыба | fa_wine | 🍷 Вино |
fa_beer | 🍺 Пиво | fa_cake | 🎂 Торт |
fa_hotdog | 🌭 Хот-дог | fa_pepper | 🌶️ Перец |
fa_carrot | 🥕 Морковь | fa_cheese | 🧀 Сыр |
fa_egg | 🥚 Яйцо | fa_bread | 🍞 Хлеб |
fa_shrimp | 🦐 Креветки | fa_drumstick | 🍗 Курица |
fa_cookie | 🍪 Печенье | fa_leaf | 🌿 Листок |
📱 Telegram уведомления
При каждом бронировании столика в Telegram будет приходить сообщение с данными клиента.
Создание бота
Создайте нового бота
Напишите команду /newbot и следуйте инструкциям:
- Введите название бота, например: Мой Ресторан Bot
- Введите username (должен заканчиваться на
bot), например: myrestaurant_bot
Скопируйте токен
BotFather пришлёт токен вида: 1234567890:AAFtaxABx... — скопируйте его.
Токен бота от @BotFather
Получение Chat ID
Вариант А — Группа или канал
Создайте группу
Создайте группу или канал в Telegram куда будут приходить уведомления о бронированиях.
Добавьте бота в группу
Добавьте вашего бота в группу как администратора.
Напишите любое сообщение
Напишите что-нибудь в группе — это нужно чтобы бот увидел чат.
Получите Chat ID
Откройте в браузере:
https://api.telegram.org/botВАШ_ТОКЕН/getUpdates
В ответе найдите "chat":{"id": — это и есть ваш Chat ID. Для групп он начинается с минуса: -1001234567890
Вариант Б — Личные сообщения
Найдите @userinfobot
В Telegram найдите бота @userinfobot и напишите ему /start
Скопируйте ваш ID
Бот ответит вашим личным ID, например: 123456789 — без минуса.
Напишите своему боту /start
Найдите вашего бота в Telegram и напишите ему /start — это обязательно для личных сообщений.
Настройка в app_config.dart
static const String telegramToken = '1234567890:AAFtaxABx...';
// Для группы/канала (с минусом):
static const String telegramChatId = '-1001234567890';
// Для личных сообщений (без минуса):
static const String telegramChatId = '123456789';
🌐 WordPress — новости и галерея
Новости и галерея загружаются автоматически с вашего WordPress сайта через REST API.
Настройка
static const String wordpressUrl = 'https://ваш-сайт.ru';
Указывайте URL без слеша в конце: https://site.ru а не https://site.ru/
Требования к WordPress
- WordPress 5.0 и выше
- REST API включён (включён по умолчанию)
- Плагины не требуются
Новости
Публикуйте новости в разделе WordPress → Записи. В приложении отображаются 20 последних записей.
Раздел Записи в WordPress
Галерея
Загружайте фото в WordPress → Медиафайлы. В приложении отображаются 50 последних изображений.
<
Раздел Медиафайлы в WordPress
Если сайта нет
// Оставьте пустым — новости и галерея скроются автоматически
static const String wordpressUrl = '';
🎯 Онбординг
Три экрана которые показываются только при первом запуске приложения. После просмотра больше не появляются.
Онбординг 1
Онбординг 2
Онбординг 3
Настройка текста
Откройте файл lib/screens/onboarding_screen.dart и найдите список _pages:
final List<Map<String, String>> _pages = [
{
'title': 'Добро пожаловать!',
'description': 'Ваше описание первого экрана.',
'image': 'assets/intro/intro1.jpg',
},
{
'title': 'Заголовок 2',
'description': 'Описание второго экрана.',
'image': 'assets/intro/intro2.jpg',
},
{
'title': 'Заголовок 3',
'description': 'Описание третьего экрана.',
'image': 'assets/intro/intro3.jpg',
},
];
Добавление картинок
Скопируйте фото в папку проекта:
assets/intro/intro1.jpg
assets/intro/intro2.jpg
assets/intro/intro3.jpg
Картинки должны быть вертикальными, рекомендуемый размер 1080×1920 px (соотношение 9:16)
Сброс онбординга для тестирования
Чтобы снова увидеть экраны онбординга — удалите и переустановите приложение, или очистите данные приложения в настройках телефона.
🖼️ Иконка приложения
Иконка приложения которая отображается на рабочем столе телефона.
Подготовка иконки
- Размер: 1024×1024 px
- Формат: PNG
- Для App Store: без прозрачного фона
Сохраните иконку по пути:
assets/icon/icon.png
Настройка адаптивной иконки
В pubspec.yaml настройте цвет фона адаптивной иконки (для Android 8+):
flutter_launcher_icons:
android: true
ios: true
image_path: "assets/icon/icon.png"
adaptive_icon_background: "#E85D26" # ваш цвет фона
adaptive_icon_foreground: "assets/icon/icon.png"
Генерация иконок
flutter pub get
dart run flutter_launcher_icons
Иконки автоматически созданы для всех размеров экранов Android и iOS.
💫 Сплеш экран
Экран загрузки который показывается при запуске приложения.
Настройка
В pubspec.yaml настройте цвет фона и изображение:
flutter_native_splash:
color: "#000000" # цвет фона
image: assets/icon/icon.png
android_12:
image: assets/icon/icon.png
color: "#000000"
Применение изменений
dart run flutter_native_splash:create
🎨 Цвета и тема
Изменение цветовой схемы приложения.
Настройка цветов
В app_config.dart:
static const Color backgroundColor = Color(0xFF0A0A0A); // фон приложения
static const Color surfaceColor = Color(0xFF141414); // цвет карточек
static const Color accentColor = Color(0xFFE85D26); // акцентный цвет
Как задать цвет
Цвет задаётся в формате Color(0xFFRRGGBB) где:
FF— непрозрачность 100%RRGGBB— HEX код цвета
Например для цвета #E85D26: Color(0xFFE85D26)
Используйте сайт colorpicker.me для подбора цвета и получения HEX кода.
🔔 Firebase Push уведомления
Отправляйте push уведомления всем пользователям приложения через Firebase Cloud Messaging.
Настройка Firebase
Создайте проект Firebase
Перейдите на console.firebase.google.com → Добавить проект → введите название.
Создание нового проекта Firebase
Добавьте Android приложение
На странице проекта нажмите иконку Android → введите package name из android/app/build.gradle.kts
Скачайте google-services.json
Скачайте файл google-services.json и скопируйте его в папку android/app/
Отправка уведомлений
Откройте Firebase Console
Перейдите на console.firebase.google.com → ваш проект
Откройте Messaging
В левом меню: DevOps & Engagement → Messaging
Заполните и отправьте
Введите заголовок и текст → выберите приложение → нажмите Опубликовать
🔐 Подпись APK
Для публикации в магазинах приложений APK должен быть подписан вашим ключом.
Файл .jks и пароль к нему нужно хранить в безопасном месте. Без них вы не сможете обновлять приложение в магазине.
Создание ключа подписи
Выполните команду в терминале (только один раз):
keytool -genkey -v -keystore C:\my_keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias mykey
Заполните поля:
| Поле | Пример |
|---|---|
| Пароль keystore | придумайте надёжный пароль |
| First and last name | Ваше Имя |
| Organization | Название организации |
| City | Moscow |
| Country code | RU |
Создание key.properties
Создайте файл android/key.properties:
storePassword=ВАШ_ПАРОЛЬ
keyPassword=ВАШ_ПАРОЛЬ
keyAlias=mykey
storeFile=C:\\путь\\к\\my_keystore.jks
Никогда не добавляйте key.properties в Git репозиторий. Файл уже добавлен в .gitignore
📦 Сборка APK
Сборка подписанного APK для публикации в магазинах.
Обновление версии
Перед каждым новым релизом обновите версию в pubspec.yaml:
version: 1.0.1+2
# ^^^^^ ^
# версия номер сборки (должен быть больше предыдущего)
Число после + должно быть строго больше предыдущей версии. Иначе магазин не примет обновление.
Сборка APK
flutter build apk --release --split-per-abi
Готовые файлы:
| Файл | Размер | Для чего |
|---|---|---|
app-arm64-v8a-release.apk | ~18 МБ | ✅ Современные телефоны (рекомендуется) |
app-armeabi-v7a-release.apk | ~16 МБ | Старые телефоны |
app-x86_64-release.apk | ~20 МБ | Эмуляторы |
Сборка AAB (для Google Play)
flutter build appbundle --release
🏪 Публикация в магазинах приложений
Инструкция по публикации приложения в Google Play, RuStore, AppGallery и других магазинах.
Что нужно подготовить
- Подписанный APK или AAB файл
- Иконка приложения 512×512 px
- Минимум 2-3 скриншота приложения (размер 1080×1920 px)
- Короткое описание (до 80 символов)
- Полное описание (до 4000 символов)
- Политика конфиденциальности
Делайте скриншоты на реальном телефоне или эмуляторе с красивыми тестовыми данными. Первый скриншот — самый важный, он виден в поиске.
Google Play
Зарегистрируйте аккаунт разработчика
Перейдите на play.google.com/console. Единовременный взнос — $25.
Создайте новое приложение
Нажмите Создать приложение, выберите язык и тип приложения.
Заполните информацию о магазине
Заполните название, описание, добавьте скриншоты и иконку в разделе Магазин → Основная страница магазина.
Загрузите AAB файл
Google Play принимает формат AAB. Соберите командой:
flutter build appbundle --release
Загрузите файл через Выпуски → Production → Создать новый выпуск
Укажите политику конфиденциальности
В разделе Политика → Политика конфиденциальности укажите ссылку на страницу политики.
Отправьте на проверку
Нажмите Отправить на проверку. Первая проверка занимает до 7 дней, последующие — 1-3 дня.
RuStore
Зарегистрируйтесь как разработчик
Перейдите на rustore.ru/developers — регистрация бесплатная.
Создайте приложение и заполните информацию
Добавьте название, описание, скриншоты и иконку.
Загрузите APK
RuStore принимает APK файл:
flutter build apk --release --split-per-abi
Загрузите app-arm64-v8a-release.apk
Укажите политику конфиденциальности
Политика должна открываться внутри приложения, не в браузере — это требование RuStore. В шаблоне это уже реализовано.
Отправьте на модерацию
Модерация занимает 1-3 рабочих дня.
AppGallery (Huawei)
Зарегистрируйтесь
Перейдите на developer.huawei.com — регистрация бесплатная.
Создайте приложение и загрузите APK
AppGallery принимает APK формат. Заполните информацию о приложении и загрузите app-arm64-v8a-release.apk
Отправьте на проверку
Проверка занимает 1-5 рабочих дней.
Публикация обновления (для всех магазинов)
Увеличьте версию в pubspec.yaml
version: 1.0.1+2 # версия и номер сборки (должен расти)
Соберите новый файл
# Для Google Play (AAB):
flutter build appbundle --release
# Для RuStore и AppGallery (APK):
flutter build apk --release --split-per-abi
Загрузите обновление
В консоли каждого магазина создайте новый выпуск и загрузите файл.
Сравнение магазинов
| Магазин | Стоимость | Формат | Модерация |
|---|---|---|---|
| Google Play | $25 (разово) | AAB | 1-7 дней |
| RuStore | Бесплатно | APK | 1-3 дня |
| AppGallery | Бесплатно | APK | 1-5 дней |
| App Store (iOS) | $99/год | IPA | 1-3 дня |
❓ FAQ
Ответы на частые вопросы.
Галерея и новости не загружаются
Проверьте что в app_config.dart указан правильный wordpressUrl. URL должен быть без слеша в конце и без /wp-json/
Бронирования не приходят в Telegram
Проверьте:
telegramTokenскопирован полностью от @BotFathertelegramChatIdдля группы начинается с минуса-- Бот добавлен в группу как администратор
- Для личных сообщений — написали боту
/start
PDF не открывается
Убедитесь что:
- Файл скопирован в папку
assets/pdfs/ - Название файла в
app_config.dartточно совпадает с именем файла - Папка зарегистрирована в
pubspec.yamlв разделеassets
Иконка меню не отображается
При добавлении новой Font Awesome иконки нужно добавить её в двух местах — в app_config.dart и в метод _getFaIcon() в menu_screen.dart
Ошибка при сборке — different roots
Проект находится на другом диске от Flutter кэша. Решение — в Android Studio: File → Settings → Languages & Frameworks → Flutter → укажите правильный путь к Flutter SDK.
Push уведомления не приходят
Убедитесь что:
- Файл
google-services.jsonскопирован в папкуandroid/app/ - Package name в Firebase совпадает с
applicationIdвbuild.gradle.kts - Приложение получило разрешение на уведомления
Как сбросить онбординг для тестирования
Удалите и переустановите приложение, или очистите данные приложения в Настройки телефона → Приложения → Pizza Mart → Очистить данные
📞 Контакты и поддержка
Если у вас возникли вопросы по установке, настройке или использованию шаблона — свяжитесь с нами любым удобным способом.
| Тип | Адрес |
|---|---|
| Поддержка покупателей | camlife73@gmail.com |
| По вопросам сотрудничества | camlife73@gmail.com |
Социальные сети
| Платформа | Ссылка |
|---|---|
| Telegram канал | https://t.me/webskill_academy |
| Telegram чат поддержки | https://t.me/danlarin |
| VK | https://vk.com/wbskills |
| Дзен | https://dzen.ru/webskill |
Исходный код
| Платформа | Ссылка |
|---|---|
| GitHub | https://github.com/danlarov |
| GitVerse | https://gitverse.ru/danlarin |
Маркетплейсы
| Площадка | Ссылка на профиль |
|---|---|
| RuStore | https://www.rustore.ru/catalog/developer/clfl9w |
Отвечаю в рабочие дни с 10:00 до 19:00 по московскому времени. Обычно в течение 24 часов.
Перед обращением в поддержку
Пожалуйста, проверьте следующее:
- Прочитайте раздел FAQ — возможно ответ уже есть
- Убедитесь что используете версию Flutter 3.41.6 и выше
- При сообщении об ошибке — приложите текст ошибки из терминала
- Укажите версию Android Studio и операционной системы
📝 Changelog
v1.0.0 — Первый релиз
- ✅ Главный экран с баннером, галереей и новостями
- ✅ PDF меню со встроенным просмотрщиком
- ✅ Форма бронирования с уведомлением в Telegram
- ✅ Новости из WordPress
- ✅ Галерея из WordPress медиафайлов
- ✅ Экран контактов с картой Яндекс
- ✅ Онбординг — 3 экрана при первом запуске
- ✅ Push уведомления через Firebase FCM
- ✅ Font Awesome иконки для меню
- ✅ Кастомное нижнее меню с поднятой кнопкой
- ✅ Сплеш экран
- ✅ Политика конфиденциальности внутри приложения