Skip to content

Latest commit

 

History

History
324 lines (247 loc) · 5.86 KB

File metadata and controls

324 lines (247 loc) · 5.86 KB

Development Guide - Fit26

Szybki Start dla Deweloperów

Pierwsze uruchomienie

# 1. Sklonuj i przejdź do projektu
git clone <repo-url>
cd fit26

# 2. Uruchom w trybie development
./dev.sh

Skrypt dev.sh automatycznie:

  • Zainstaluje zależności
  • Wygeneruje kod (build_runner)
  • Uruchomi aplikację z hot reload

Deployment na fizyczny telefon

# Podłącz telefon przez USB, włącz USB Debugging

# Debug build (szybki, z debugowaniem)
./deploy_android.sh

# Release build (zoptymalizowany, bez debugowania)
./deploy_android.sh -r

# Clean + Release (gdy masz problemy z cache)
./deploy_android.sh -c -r

Workflow Deweloperski

1. Dodawanie nowych funkcji

# Utwórz nowy branch
git checkout -b feature/nazwa-funkcji

# Pracuj z hot reload
./dev.sh

# Naciśnij 'r' dla hot reload podczas pracy

2. Generowanie kodu (po zmianach w modelach)

Gdy dodajesz/modyfikujesz:

  • Modele z @freezed
  • Providery z @riverpod
  • Tabele Drift

Uruchom:

dart run build_runner build --delete-conflicting-outputs

Lub w tle podczas developmentu:

dart run build_runner watch --delete-conflicting-outputs

3. Testowanie

# Wszystkie testy
flutter test

# Pojedynczy plik
flutter test test/widget_test.dart

# Z coverage
flutter test --coverage

4. Analiza kodu

# Sprawdź błędy i warningi
flutter analyze

# Formatowanie kodu
dart format lib/

# Napraw automatyczne problemy
dart fix --apply

Struktura - Gdzie dodawać nowy kod?

Nowy model domenowy

lib/domain/models/
  └── nazwa_modelu.dart  # @freezed + toJson/fromJson

Nowy serwis

lib/domain/services/
  └── nazwa_service.dart  # @riverpod

Nowy ekran

lib/features/nazwa_ekranu/
  ├── nazwa_screen.dart        # ConsumerWidget
  ├── providers/
  │   └── nazwa_provider.dart  # @riverpod state
  └── widgets/
      ├── nazwa_form.dart
      └── nazwa_list.dart

Nowa tabela DB

lib/data/db/
  └── database.dart  # Dodaj klasę extends Table

Potem:

dart run build_runner build -d

Nowy reużywalny widget

lib/shared/widgets/
  └── nazwa_widget.dart

Debugging

VS Code

  1. Otwórz projekt w VS Code
  2. F5 lub Run > Start Debugging
  3. Ustaw breakpointy klikając na marginesie

Android Studio

  1. Otwórz projekt
  2. Shift+F10 (Run) lub Shift+F9 (Debug)

DevTools

# W terminalu gdzie działa flutter run
# Naciśnij 'v' aby otworzyć DevTools w przeglądarce

Częste Problemy

"Error: Cannot find package..."

flutter pub get

"Error: The getter 'xxx' isn't defined"

dart run build_runner build --delete-conflicting-outputs

"Gradle build failed"

cd android
./gradlew clean
cd ..
flutter clean
flutter pub get

"Device not found"

# Sprawdź czy ADB widzi telefon
adb devices

# Jeśli nie:
# 1. Włącz USB Debugging na telefonie
# 2. Odłącz i podłącz ponownie
# 3. Zaakceptuj prompt na telefonie

"Hot reload nie działa"

# W terminalu gdzie działa flutter run
# Naciśnij 'R' (capital R) dla hot restart

Code Style

Importy

// 1. Dart/Flutter core
import 'package:flutter/material.dart';

// 2. External packages (pub.dev)
import 'package:riverpod_annotation/riverpod_annotation.dart';

// 3. Własne pliki
import '../../domain/models/entry.dart';

// 4. Generated
part 'filename.g.dart';

Nazewnictwo

  • Klasy: PascalCase (np. TodayScreen)
  • Pliki: snake_case (np. today_screen.dart)
  • Zmienne/funkcje: camelCase (np. totalDuration)
  • Prywatne: _leading_underscore (np. _buildCard)
  • Stałe: lowerCamelCase (np. defaultPadding)

Widgets

  • Preferuj const konstruktory
  • Rozdzielaj duże widgety na mniejsze metody/klasy
  • Używaj ConsumerWidget dla Riverpod
  • Spacing: używaj Gap* zamiast SizedBox

State Management

// ✅ Dobrze - Notifier pattern
@riverpod
class TodosNotifier extends _$TodosNotifier {
  @override
  Future<List<Todo>> build() async {
    // load data
  }
}

// ❌ Źle - zwykły provider dla mutowalnego stanu
@riverpod
List<Todo> todos(TodosRef ref) {
  return []; // Don't do this for mutable state
}

Performance Tips

  1. Używaj const widgets: const Text('Hello')
  2. Selektory: ref.watch(provider.select((s) => s.field))
  3. Keys dla list: ValueKey(item.id)
  4. Lazy loading: ListView.builder zamiast ListView
  5. Cache images: użyj CachedNetworkImage jeśli dodasz obrazy

Git Workflow

# Nowa funkcja
git checkout -b feature/nazwa
# ... zmiany ...
git add .
git commit -m "feat: opis funkcji"
git push origin feature/nazwa

# Fix
git checkout -b fix/nazwa
# ... zmiany ...
git commit -m "fix: opis poprawki"

# Commit messages:
# feat: nowa funkcja
# fix: poprawka błędu
# refactor: refaktoryzacja kodu
# docs: dokumentacja
# test: testy
# style: formatowanie

Przed Pull Requestem

# 1. Formatowanie
dart format lib/

# 2. Analiza
flutter analyze

# 3. Testy
flutter test

# 4. Build test
flutter build apk --debug

# Jeśli wszystko OK - create PR!

Pomocne Komendy

# Flutter doctor - sprawdź setup
flutter doctor -v

# Lista urządzeń
flutter devices

# Logi w czasie rzeczywistym
adb logcat | grep flutter

# Wielkość APK
flutter build apk --release --analyze-size

# Zrzut ekranu z aplikacji (gdy działa)
flutter screenshot

# Czyszczenie cache
flutter clean
flutter pub cache repair

Przydatne Linki

Support

Masz pytania? Sprawdź:

  1. README.md - podstawowe info o projekcie
  2. Ten plik - development workflow
  3. Kod w lib/ - przykłady implementacji