Minimal, güvenli ve hataya dayanıklı bir dijital kartvizit uygulaması.
Profil bilgilerini API'den çeker, güvenilir veri geldiyse vCard/QR üretip paylaşmanı sağlar.
İnternet/endpoint sorunlarında çökmez, kullanıcıyı uygun mesajlarla yönlendirir.
- vCard & QR üretimi (yalnızca güvenilir ağ verisi geldiyse)
- Paylaş:
.vcfdosyası olarak paylaş - Hata merkezi: Ağ/JSON/timeout/401/404 gibi durumlar için i18n mesajları
- Token yönetimi:
flutter_secure_storageile güvenli kalıcı depolama - Dil/yerel ayar:
tr,en,de,fr - Asset fallback: API yoksa
assets/profile.jsondenenir (demo amaçlıdır; QR üretmez)
lib/
├─ main.dart # Uygulama akışı (kısa ve temiz tutuldu)
├─ core/
│ ├─ i18n.dart # Çeviriler ve locale yardımcıları
│ └─ error_center.dart # Hata toplama + trusted/untrusted veri bayrağı + banner
├─ services/
│ ├─ safe_http.dart # HTTP sarmalayıcı: timeout/host/httpStatus/JSON hatalarını sınıflandırır
│ └─ token_store.dart # flutter_secure_storage ile access token kalıcı saklama
└─ ui/
├─ pages.dart # InfoPage, QrPage
└─ widgets.dart # DotPager, EdgePagerNav, Card vb. küçük bileşenler
Not: vCard/QR sadece ağdan 200 OK ile gelen ve geçerli formatlı (trusted) profille üretilir.
Asset veya default veriler görüntülenir ama QR üretmez ve Paylaş kapalıdır.
- Flutter 3.x (stable)
- Dart SDK Flutter ile gelir
flutter --version- Bağımlılıklar
flutter pub get
- pubspec.yaml — assets tanımı
flutter:
uses-material-design: true
assets:
- assets/profile.json
assets/profile.json örneği:
{
"name": "Ada Lovelace",
"title": "Software Engineer",
"company": "Example Inc.",
"work": "+902122223344",
"mobile": "+905551112233",
"email": "ada@example.com"
}
- Endpoint'leri ayarla main.dart başlarında:
const String PROFILE_URL = 'https://api.npoint.io/69c28a4ff7714f6a7c29';
const String AUTH_URL = 'https://example.com/api/session'; // gerçek yoksa böyle bırak
PROFILE_URL: JSON profil dönen uç nokta (GET). AUTH_URL: Örnek. example.com kaldığı sürece login denenmez (anonim). Gerçekte POST /login vs. kullanın ve safe_http.dart üzerinden çağırın.
Çalıştırma
# Cihaz/Emülatör seç
flutter devices
# Koş
flutter run -d <deviceId>
Token Mantığı (özet) Uygulama açılırken:
TokenStore.readAccess() ile secure storage'dan token okunur (varsa RAM'e alınır). Token yoksa ve AUTH_URL gerçekse server'dan istenir → başarılıysa secure storage'a yazılır. PROFILE_URL çağrısı 401 dönerse token geçersizdir → secure storage temizlenir. Profil yanıtı içinde yeni token dönerse rotasyon yapılır (storage güncellenir). Android'de EncryptedSharedPreferences, iOS'ta Keychain kullanılır.
i18n & Yerel Kurallar
Mevcut diller: tr, en, de, fr (otomatik locale algılanır) TR için telefon numarası basit şekilde E.164 (+90…) formatına normalize edilir. UI metinleri core/i18n.dart içinden I18n.t('key') ile gelir.
Hata Yönetimi Tüm HTTP istekleri services/safe_http.dart üzerinden gider:
Timeout → TimeoutException Host/bağlantı → SocketException HTTP durum → HttpStatusException(statusCode) Geçersiz URL → InvalidUrlException Kötü JSON → BadJsonException
core/error_center.dart gelen hatayı i18n mesajına çevirir ve ekranda banner olarak gösterir. Trusted veri bayrağı:
markProfileTrusted() → yalnızca 200 + geçerli JSON ile çağrılır markProfileUntrusted() → diğer bütün durumlar QR/vCard üretimi: yalnızca trusted=true iken
Beklenen Davranışlar
Endpoint bozuk → Hata banner'ı, QR görünmez, Paylaş butonu devre dışı JSON formatı yanlış → Hata banner'ı, QR görünmez 401 → Token temizlenir, hata banner'ı Timeout/Host → Hata banner'ı, asset/default gösterilir ama QR görünmez
Hızlı Test Senaryoları
Başarılı akış PROFILE_URL çalışıyor → Profil gelir, QR oluşur, Paylaş aktif. Bozulan endpoint PROFILE_URL sonuna rasgele r ekle → Hata banner'ı, QR yok, Paylaş pasif. 401 simülasyonu safe_http.dart içinde mock dön veya API'ni 401 verdirt → Token temizlenir, QR yok. Asset fallback İnternet kapalıyken aç → assets/profile.json gösterilir, QR yok (demo verisi).
Başlıca Paketler
http – ağ istekleri (sarmalayıcı: safe_http.dart) flutter_secure_storage – güvenli token depolama qr_flutter – QR görselleştirme share_plus – .vcf dosyasını paylaşma path_provider – temp dizin erişimi
Sık Karşılaşılanlar
Target of URI doesn't exist → flutter pub get YAML hatası → pubspec.yaml girintileme (space) kontrol edin RenderFlex overflow → Genişliği aşan UI; projede FittedBox/Expanded ile ele alındı Chrome/Web'de swipe yok → Ok navigasyonunu EdgePagerNav ile kullanabilirsin