Ficha 02 · FlutterFlow + Thunkable + publicação
Exercício 1 · FlutterFlow setup
Cria conta em flutterflow.io. Cria novo projecto "Café Order" com template "Blank". Conecta Firebase (cria projecto Firebase free se necessário).
Resposta:
- flutterflow.io → sign up.
- New project → name "Café Order" → blank.
- Firebase setup:
- console.firebase.google.com → New project "cafe-order-app".
- Authentication → Sign-in method → enable Email/Password.
- Firestore → create database (test mode para começar).
- Voltar ao FlutterFlow → Settings → Firebase → conectar:
- Project ID, App nickname.
- Sigue prompts FF para auto-generar configs.
Após este passo, podes criar Firestore collections directamente do FF editor.
Exercício 2 · UI cards de produtos
Em FlutterFlow, cria página "Menu": - AppBar com título "Menu". - ListView vertical. - Cada item é Card com Image, Title, Price, Button "Add to cart".
Dados mock (hardcoded ou Firestore com 3-5 produtos).
Resposta:
- Firestore (FF Editor → Firestore → Create collection):
- Collection "products":
- id, name (string), price (double), photo (string url), description.
-
Adicionar 5 documentos de exemplo.
-
FF Page "Menu":
- App Bar: title "Menu".
-
Body:
- Column → ListView (Vertical).
- Backend Query on ListView: Firestore → products → No filter.
- Cell: Card →
- Row:
- Image (network) → bind to products.photo.
- Column (flex):
- Text → bind to products.name (bold).
- Text → bind to products.description (small).
- Text → bind to products.price + " €".
- Button "+" → action: Add to cart (state).
-
Run → ver no preview.
Exercício 3 · Estado do carrinho
Adiciona ao FF app: - Variável global "cart" (lista de products). - Botão "+" do menu adiciona ao cart. - Página "Cart" mostra items + total. - Counter no AppBar mostra número items.
Resposta:
- App State (FF Editor → App State):
-
Add field "cart" → type "Document Reference" (Product) → List → default [].
-
Action no botão "+":
-
Update App State → Add to list "cart" the product reference.
-
AppBar badge:
-
Container com Text bind to "App State > cart > length".
-
Cart Page:
- ListView → bind to App State "cart".
- Each item: cell com Image, Name, Price.
- Footer: Text "Total: " + Sum(cart items prices).
-
Button "Checkout" (sem implementação real ainda).
-
Remove from cart action: Update App State → Remove from list "cart" at index.
Exercício 4 · Auth Firebase
Adiciona Login + Signup à app: - Splash → check logged-in → Home ou Login. - Login: email + password, "Sign in" + "Create account" link. - Signup: nome + email + password + confirm. - Profile: nome + email logged-in user.
Resposta:
-
Firebase Authentication: já está ligado do exercício 1.
-
FF Pages:
- Login: 2 TextFields (email, password), Button "Sign in" → Auth Action → Login with Email.
- Signup: similar + name field → Auth Action → Create Account with Email.
- Profile: read AuthenticatedUser data → display.
-
Splash: on page load → check
currentUserUid→ if signed-in, navigate Home; else Login. -
Auth flow:
-
FF → Authentication tab → Initial Page logic:
- If logged in → Menu.
- Else → Login.
-
Logout button: Action → Auth → Log out → Navigate to Login.
Exercício 5 · Push notification (FCM)
Activa Firebase Cloud Messaging na app. Envia uma test notification do Firebase Console à app.
Resposta:
-
Firebase Console → Project → Build → Cloud Messaging → enable.
-
FlutterFlow → Settings → Push Notifications → Enable.
-
Auto-gera código para registrar device token.
-
Run app no telemóvel (Test Mode ou build):
- Pede permissão para notifications.
-
Após aceitar, FCM regista device token.
-
Firebase Console → Cloud Messaging → New campaign:
- Title: "Especial do dia!"
- Body: "Hoje café por 1€"
- Target: All users.
- Send.
Notification chega ao telemóvel em segundos.
Para notifications automáticas (ex: "ordem pronta"): Cloud Functions Firebase chamadas por trigger.
Exercício 6 · Thunkable — block-based
Cria conta em thunkable.com (free). Cria app simples "Tip Calculator": - Input: valor da factura. - Slider: % de gorgeta. - Output: total + gorgeta.
Resposta:
-
thunkable.com → New Project → Cross Platform → Blank.
-
Design tab:
- Label "Tip Calculator" (header).
- TextInput "billInput" (Type: Number).
- Slider "tipSlider" (Min 0, Max 30, Value 15).
- Label "tipDisplay" → "Tip: 15%".
- Label "tipAmount" → "Tip: €0.00".
-
Label "totalAmount" → "Total: €0.00" (large, bold).
-
Blocks tab:
-
When
tipSlider.Value changes:- Set
tipDisplay.Textto"Tip: " + (tipSlider.Value rounded) + "%". - Set
tipAmount.Textto"Tip: €" + (billInput.Text * tipSlider.Value / 100). - Set
totalAmount.Textto"Total: €" + (billInput.Text * (1 + tipSlider.Value / 100)).
- Set
-
When
billInput.Changed: mesma lógica. -
Live test: instalar Thunkable Live app → scan QR code → testar instantaneamente.
Exercício 7 · Privacy policy + screenshots
Para qualquer das apps anteriores, prepara assets de publicação: - Política de privacidade (URL public). - 4 screenshots (telemóvel). - Ícone alta-res (512x512). - Descrição curta + longa.
Resposta:
1. Política de privacidade: - Gerador gratuito: termly.io ou app-privacy-policy-generator.firebaseapp.com. - Resposta: nome app + tipo dados (email, push token, etc.). - Output: URL para hospedar (GitHub Gist público, Google Docs publicado, ou Notion público).
2. Screenshots: - Capturar no telemóvel (premir botão Power + Volume Down em Android). - Resolução: dispositivos modernos OK (mínimo 1080x1920 portrait). - 4 ecrãs principais da app. - Editar com texto explicativo (Canva, Figma): "Lista todos os teus pratos", "Add new item with photo", etc.
3. Ícone: - 512x512 px PNG. - Sem texto pequeno (não se vê). - Cor distintiva. - Usar Canva / Figma / Photopea. - Free: lookmoji.com, iconfinder com creative commons.
4. Descrições: - Curta (Google Play 80 chars): "App para registar refeições diárias com fotos e calorias." - Longa (até 4000 chars): - Primeiras 2 frases mais importantes (mostradas em "ver mais"). - 3-5 features principais com bullets. - Quem é para. - Call to action.
5. Texto loja Apple: - Subtítulo (30 chars). - Promotional text (170 chars) — alterável sem update. - Keywords (100 chars separados por vírgula, sem espaços).
Stores valorizam textos claros, sem promessas exageradas, sem emojis em excesso.
Exercício 8 · PWA install + comparação
Pega 2 apps que fizeste (Glide + FlutterFlow ou Adalo). Instala como PWA em telemóvel. Compara: visual, performance, "feel". Escreve uma página resumindo prós/contras.
Resposta:
Instalação PWA (sem stores): - Glide: app URL → no telemóvel → Add to home screen → ícone aparece. - FlutterFlow web build: similar. - Adalo: web URL → idem.
Critérios de comparação:
| Critério | Glide | Adalo | FlutterFlow |
|---|---|---|---|
| Tempo de construção | 30 min | 2h | 4h |
| Visual / polish | Bom | Excelente | Excelente |
| Performance | Boa | Excelente | Top |
| Custo | Free | Free | Free (limited) |
| Customização | Limitada | Boa | Quase ilimitada |
| Lock-in | Total | Total | Parcial (export) |
| Stores | PWA only | Sim ($99/$25) | Sim |
| Learning curve | 5 min | 30 min | 2h |
Quando escolher:
- Glide: validação rápida, internal tools, MVPs simples (1-3 dias).
- Adalo: apps que vão para stores, sem complicação técnica.
- FlutterFlow: apps sérias com futuro escalável, equipas técnicas.
Conclusão típica para projecto pessoal pequeno: Glide ganha em rapidez. Para empresa séria: FlutterFlow ou Adalo conforme orçamento. Para validação de ideia: Glide chega.