🍕 Pizza Mart

Универсальный Flutter шаблон мобильного приложения для ресторана, кафе или бара. Настраивается под любое заведение за 15 минут через один конфигурационный файл.

Flutter 3.41.6 Android + iOS WordPress API Firebase FCM Telegram Bot
описание

Скриншот главного экрана приложения

Что включено

🏠

Главная

Баннер, галерея, новости, контакты

📖

PDF Меню

Встроенный просмотрщик PDF файлов

📅

Бронирование

Форма → уведомление в Telegram

📰

Новости

Загружаются с WordPress сайта

🖼️

Галерея

Фото из WordPress медиафайлов

📍

Контакты

Телефон, адрес, карта, соцсети

🔔

Push уведомления

Firebase Cloud Messaging

🎯

Онбординг

3 экрана при первом запуске

Экраны приложения

Онбординг — три экрана при первом запуске

Онбординг 1

Онбординг 1

Онбординг 2

Онбординг 2

Онбординг 3

Онбординг 3

Главная и бронирование

Сплеш

Главная 1

Главная

Главная 2

Меню

Бронь столика

Меню, новости, контакты

Новости

Меню

Бронирование

Новости

Галерея

Страница новостей

Контакты

Контакты

⚙️ Требования

Перед началом работы убедитесь что на вашем компьютере установлено всё необходимое.

Требования к хостингу (для новостей и галереи)

Если вы хотите использовать новости и галерею в приложении, вам нужен хостинг с WordPress. Если новости и галерея не нужны — хостинг не обязателен.

ТребованиеМинимумРекомендуется
PHP7.4+8.1+
MySQL5.7+8.0+
WordPress5.0+6.0+
SSL сертификатОбязательно (HTTPS)Let's Encrypt (бесплатно)
Дисковое пространство1 ГБ5+ ГБ
REST API WordPressВключён по умолчанию
💡
Без хостинга

Если хостинг не нужен — оставьте wordpressUrl = '' в конфиге. Разделы новостей и галереи автоматически скроются.

Необходимые инструменты

ИнструментВерсияСсылка
Flutter SDK3.41.6 и вышеflutter.dev
Android Studio2024.1+developer.android.com
Dart SDK3.9.0+Входит в Flutter
Java JDK17+adoptium.net
GitЛюбаяgit-scm.com

Установка Flutter

1

Скачайте Flutter SDK

Перейдите на flutter.dev и скачайте Flutter SDK для Windows.

2

Распакуйте архив

Распакуйте в папку без пробелов и специальных символов, например C:\flutter

3

Добавьте в PATH

Добавьте C:\flutter\bin в системную переменную PATH.

4

Проверьте установку

flutter doctor

Все пункты должны быть отмечены зелёной галочкой ✓

ℹ️
Совет

Если flutter doctor показывает ошибки — следуйте инструкциям в выводе команды для их исправления.

🚀 Быстрый старт

Запустите приложение за несколько минут.

1

Распакуйте архив

Распакуйте скачанный архив с исходниками в удобную папку.

2

Откройте проект в Android Studio

Запустите Android Studio → File → Open → выберите папку проекта.

Запуск проекта

Открытие проекта в Android Studio

3

Установите зависимости

В терминале Android Studio выполните:

flutter pub get
4

Запустите эмулятор или подключите телефон

В Android Studio выберите устройство в выпадающем списке вверху.

5

Нажмите Run ▶

Приложение соберётся и запустится на устройстве.

Кнопка Run

Кнопка Run в Android Studio

Готово!

Приложение запущено. Теперь настройте его под ваше заведение в файле lib/config/app_config.dart

📁 Структура проекта

Обзор файлов и папок проекта.

pizza_mart/ ├── assets/ │ ├── icon/ │ │ └── icon.png ← иконка приложения 1024x1024 │ ├── intro/ │ │ ├── intro1.jpg ← картинки онбординга │ │ ├── intro2.jpg │ │ └── intro3.jpg │ └── pdfs/ │ ├── food.pdf ← PDF файлы меню │ ├── drinks.pdf │ └── desserts.pdf ├── lib/ │ ├── config/ │ │ └── app_config.dart ← ВСЕ НАСТРОЙКИ ЗДЕСЬ │ ├── screens/ │ │ ├── home_screen.dart │ │ ├── menu_screen.dart │ │ ├── booking_screen.dart │ │ ├── news_screen.dart │ │ ├── gallery_screen.dart │ │ ├── contacts_screen.dart │ │ └── onboarding_screen.dart │ ├── services/ │ │ └── firebase_service.dart │ └── main.dart ├── android/ │ ├── build.gradle.kts ← корневой gradle │ └── app/ │ ├── build.gradle.kts ← gradle приложения │ ├── google-services.json ← Firebase конфиг │ └── key.properties ← данные подписи └── pubspec.yaml ← зависимости проекта
💡
Главный файл настроек

Всё что нужно для настройки приложения находится в 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 с тысячами иконок для разделов меню.

Как найти иконку

1

Откройте сайт Font Awesome

Перейдите на fontawesome.com/icons

2

Найдите иконку

Введите название на английском в поиск: pizza, burger, wine, salad и т.д.

Иконки

Поиск иконок на сайте fontawesome.com

3

Выберите бесплатную иконку

Фильтруйте по Free — только они доступны без подписки.

4

Скопируйте название

Нажмите на иконку и скопируйте её название, например pizza-slice

Как использовать в app_config.dart

Добавьте префикс fa_ и замените дефисы на подчёркивания:

Название на fontawesome.comВ app_config.dart
pizza-slicefa_pizza
burgerfa_burger
martini-glassfa_martini
bowl-foodfa_bowl
mug-hotfa_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 будет приходить сообщение с данными клиента.

Создание бота

1

Найдите @BotFather в Telegram

Откройте Telegram и в поиске найдите @BotFather (официальный бот с синей галочкой).

Бот в Телеграм

@BotFather в Telegram

2

Создайте нового бота

Напишите команду /newbot и следуйте инструкциям:

  • Введите название бота, например: Мой Ресторан Bot
  • Введите username (должен заканчиваться на bot), например: myrestaurant_bot
3

Скопируйте токен

BotFather пришлёт токен вида: 1234567890:AAFtaxABx... — скопируйте его.

Токен бота от @BotFather

Получение Chat ID

Вариант А — Группа или канал

1

Создайте группу

Создайте группу или канал в Telegram куда будут приходить уведомления о бронированиях.

2

Добавьте бота в группу

Добавьте вашего бота в группу как администратора.

3

Напишите любое сообщение

Напишите что-нибудь в группе — это нужно чтобы бот увидел чат.

4

Получите Chat ID

Откройте в браузере:

https://api.telegram.org/botВАШ_ТОКЕН/getUpdates

В ответе найдите "chat":{"id": — это и есть ваш Chat ID. Для групп он начинается с минуса: -1001234567890

Вариант Б — Личные сообщения

1

Найдите @userinfobot

В Telegram найдите бота @userinfobot и напишите ему /start

2

Скопируйте ваш ID

Бот ответит вашим личным ID, например: 123456789 — без минуса.

3

Напишите своему боту /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 → Записи. В приложении отображаются 20 последних записей.

Запуск проекта

Раздел Записи в WordPress

Галерея

Загружайте фото в WordPress → Медиафайлы. В приложении отображаются 50 последних изображений.

< Запуск проекта

Раздел Медиафайлы в WordPress

Если сайта нет

// Оставьте пустым — новости и галерея скроются автоматически
static const String wordpressUrl = '';

🎯 Онбординг

Три экрана которые показываются только при первом запуске приложения. После просмотра больше не появляются.

Онбординг 1

Онбординг 1

Онбординг 2

Онбординг 2

Онбординг 3

Онбординг 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)

Сброс онбординга для тестирования

Чтобы снова увидеть экраны онбординга — удалите и переустановите приложение, или очистите данные приложения в настройках телефона.

🖼️ Иконка приложения

Иконка приложения которая отображается на рабочем столе телефона.

Подготовка иконки

Сохраните иконку по пути:

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) где:

Например для цвета #E85D26: Color(0xFFE85D26)

💡
Подбор цвета

Используйте сайт colorpicker.me для подбора цвета и получения HEX кода.

🔔 Firebase Push уведомления

Отправляйте push уведомления всем пользователям приложения через Firebase Cloud Messaging.

Настройка Firebase

1

Создайте проект Firebase

Перейдите на console.firebase.google.com → Добавить проект → введите название.

Запуск проекта

Создание нового проекта Firebase

2

Добавьте Android приложение

На странице проекта нажмите иконку Android → введите package name из android/app/build.gradle.kts

3

Скачайте google-services.json

Скачайте файл google-services.json и скопируйте его в папку android/app/

Отправка уведомлений

1

Откройте Firebase Console

Перейдите на console.firebase.google.com → ваш проект

2

Откройте Messaging

В левом меню: DevOps & Engagement → Messaging

3

Создайте уведомление

Нажмите Создать первую кампанию → Firebase Notification messages

Firebase

Создание уведомления в Firebase Console

4

Заполните и отправьте

Введите заголовок и текст → выберите приложение → нажмите Опубликовать

🔐 Подпись APK

Для публикации в магазинах приложений APK должен быть подписан вашим ключом.

⚠️
Сохраните keystore файл!

Файл .jks и пароль к нему нужно хранить в безопасном месте. Без них вы не сможете обновлять приложение в магазине.

Создание ключа подписи

Выполните команду в терминале (только один раз):

keytool -genkey -v -keystore C:\my_keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias mykey

Заполните поля:

ПолеПример
Пароль keystoreпридумайте надёжный пароль
First and last nameВаше Имя
OrganizationНазвание организации
CityMoscow
Country codeRU

Создание 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 и других магазинах.

Что нужно подготовить

💡
Совет по скриншотам

Делайте скриншоты на реальном телефоне или эмуляторе с красивыми тестовыми данными. Первый скриншот — самый важный, он виден в поиске.

Google Play

1

Зарегистрируйте аккаунт разработчика

Перейдите на play.google.com/console. Единовременный взнос — $25.

2

Создайте новое приложение

Нажмите Создать приложение, выберите язык и тип приложения.

3

Заполните информацию о магазине

Заполните название, описание, добавьте скриншоты и иконку в разделе Магазин → Основная страница магазина.

4

Загрузите AAB файл

Google Play принимает формат AAB. Соберите командой:

flutter build appbundle --release

Загрузите файл через Выпуски → Production → Создать новый выпуск

5

Укажите политику конфиденциальности

В разделе Политика → Политика конфиденциальности укажите ссылку на страницу политики.

6

Отправьте на проверку

Нажмите Отправить на проверку. Первая проверка занимает до 7 дней, последующие — 1-3 дня.

RuStore

1

Зарегистрируйтесь как разработчик

Перейдите на rustore.ru/developers — регистрация бесплатная.

2

Создайте приложение и заполните информацию

Добавьте название, описание, скриншоты и иконку.

3

Загрузите APK

RuStore принимает APK файл:

flutter build apk --release --split-per-abi

Загрузите app-arm64-v8a-release.apk

4

Укажите политику конфиденциальности

Политика должна открываться внутри приложения, не в браузере — это требование RuStore. В шаблоне это уже реализовано.

5

Отправьте на модерацию

Модерация занимает 1-3 рабочих дня.

AppGallery (Huawei)

1

Зарегистрируйтесь

Перейдите на developer.huawei.com — регистрация бесплатная.

2

Создайте приложение и загрузите APK

AppGallery принимает APK формат. Заполните информацию о приложении и загрузите app-arm64-v8a-release.apk

3

Отправьте на проверку

Проверка занимает 1-5 рабочих дней.

Публикация обновления (для всех магазинов)

1

Увеличьте версию в pubspec.yaml

version: 1.0.1+2  # версия и номер сборки (должен расти)
2

Соберите новый файл

# Для Google Play (AAB):
flutter build appbundle --release

# Для RuStore и AppGallery (APK):
flutter build apk --release --split-per-abi
3

Загрузите обновление

В консоли каждого магазина создайте новый выпуск и загрузите файл.

Сравнение магазинов

МагазинСтоимостьФорматМодерация
Google Play$25 (разово)AAB1-7 дней
RuStoreБесплатноAPK1-3 дня
AppGalleryБесплатноAPK1-5 дней
App Store (iOS)$99/годIPA1-3 дня

❓ FAQ

Ответы на частые вопросы.

Галерея и новости не загружаются

Проверьте что в app_config.dart указан правильный wordpressUrl. URL должен быть без слеша в конце и без /wp-json/

Бронирования не приходят в Telegram

Проверьте:

PDF не открывается

Убедитесь что:

Иконка меню не отображается

При добавлении новой Font Awesome иконки нужно добавить её в двух местах — в app_config.dart и в метод _getFaIcon() в menu_screen.dart

Ошибка при сборке — different roots

Проект находится на другом диске от Flutter кэша. Решение — в Android Studio: File → Settings → Languages & Frameworks → Flutter → укажите правильный путь к Flutter SDK.

Push уведомления не приходят

Убедитесь что:

Как сбросить онбординг для тестирования

Удалите и переустановите приложение, или очистите данные приложения в Настройки телефона → Приложения → Pizza Mart → Очистить данные

📞 Контакты и поддержка

Если у вас возникли вопросы по установке, настройке или использованию шаблона — свяжитесь с нами любым удобным способом.

Email

ТипАдрес
Поддержка покупателейcamlife73@gmail.com
По вопросам сотрудничестваcamlife73@gmail.com

Социальные сети

ПлатформаСсылка
Telegram каналhttps://t.me/webskill_academy
Telegram чат поддержкиhttps://t.me/danlarin
VKhttps://vk.com/wbskills
Дзенhttps://dzen.ru/webskill

Исходный код

ПлатформаСсылка
GitHubhttps://github.com/danlarov
GitVersehttps://gitverse.ru/danlarin

Маркетплейсы

ПлощадкаСсылка на профиль
RuStorehttps://www.rustore.ru/catalog/developer/clfl9w
Время ответа

Отвечаю в рабочие дни с 10:00 до 19:00 по московскому времени. Обычно в течение 24 часов.

Перед обращением в поддержку

Пожалуйста, проверьте следующее:

📝 Changelog

v1.0.0 — Первый релиз