Flutter: Resim Eklemek - Assets ve Image.asset

Flutter'da projenize resim eklemek için önce resimleri bir klasöre yerleştirmeniz ve ardından pubspec.yaml dosyasında bunları asset olarak tanımlamanız gerekir.
Adım 1: Resim Klasörü Oluşturma
Flutter projenizin kök dizininde (lib klasörü ile aynı seviyede) bir resim klasörü oluşturun:
my_flutter_app/
├── lib/
├── assets/
│ └── images/
│ ├── logo.png
│ ├── profile.jpg
│ └── banner.png
├── pubspec.yaml
└── ...Not: Klasör ismi genellikle assets, images veya assets/images şeklinde olur. İstediğiniz ismi verebilirsiniz.
Adım 2: pubspec.yaml Yapılandırması
pubspec.yaml dosyasını açın ve flutter: bölümünün altına assets tanımlamasını ekleyin:
Tek Bir Resim Ekleme
flutter:
uses-material-design: true
assets:
- assets/images/logo.pngTüm Klasörü Ekleme
flutter:
uses-material-design: true
assets:
- assets/images/Klasör yolu sonunda / işareti olursa, o klasördeki tüm dosyalar asset olarak eklenir (alt klasörler hariç).
Alt Klasörlerle Birlikte
flutter:
assets:
- assets/images/
- assets/images/icons/
- assets/images/backgrounds/Örnek pubspec.yaml
name: my_app
description: My Flutter application.
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
flutter:
uses-material-design: true
assets:
- assets/images/
- assets/icons/Adım 3: Resimleri Kullanma
Image.asset Widget
Image.asset('assets/images/logo.png')Boyutlandırma
Image.asset(
'assets/images/logo.png',
width: 200,
height: 200,
)BoxFit ile Sığdırma
Image.asset(
'assets/images/banner.png',
width: double.infinity,
height: 200,
fit: BoxFit.cover, // Alanı kapla
)BoxFit değerleri:
cover: Alanı tamamen kaplar, kırparcontain: Tamamı görünür, boşluk kalabilirfill: Alanı doldurur, oran bozulabilirfitWidth: Genişliğe göre sığdırfitHeight: Yüksekliğe göre sığdırnone: Orijinal boyutscaleDown: contain gibi ama küçültmez
Pratik Kullanım Örnekleri
Örnek 1: Logo Gösterme
class LogoWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Image.asset(
'assets/images/logo.png',
width: 150,
height: 150,
),
);
}
}Örnek 2: Profil Resmi
CircleAvatar(
radius: 50,
backgroundImage: AssetImage('assets/images/profile.jpg'),
)Örnek 3: Banner Resmi
Container(
width: double.infinity,
height: 200,
child: Image.asset(
'assets/images/banner.png',
fit: BoxFit.cover,
),
)Örnek 4: Icon Resmi
Row(
children: [
Image.asset(
'assets/images/icons/star.png',
width: 24,
height: 24,
),
SizedBox(width: 8),
Text('Favorilerim'),
],
)Örnek 5: Arka Plan Resmi
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/background.jpg'),
fit: BoxFit.cover,
),
),
child: Center(
child: Text(
'Hoş Geldiniz',
style: TextStyle(
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
),
)Çoklu Ekran Desteği için Resimler
Farklı ekran yoğunluklarına göre farklı çözünürlükte resimler kullanabilirsiniz:
Klasör Yapısı
assets/
└── images/
├── logo.png (1x - mdpi)
├── 1.5x/
│ └── logo.png (1.5x - hdpi)
├── 2.0x/
│ └── logo.png (2x - xhdpi)
├── 3.0x/
│ └── logo.png (3x - xxhdpi)
└── 4.0x/
└── logo.png (4x - xxxhdpi)pubspec.yaml
flutter:
assets:
- assets/images/logo.pngNot: 1.5x, 2.0x, 3.0x, 4.0x klasörlerini otomatik olarak algılar, ayrıca belirtmeye gerek yok.
Kullanımı
Image.asset('assets/images/logo.png')Flutter otomatik olarak cihazın yoğunluğuna göre uygun resmi seçer.
Resim İsimlendirme Önerileri
Çözünürlükle ilgili isimlendirme:
logo_low.png // Düşük çözünürlük
logo_medium.png // Orta çözünürlük
logo_high.png // Yüksek çözünürlükveya boyut belirtme:
icon_24.png // 24x24 piksel
icon_48.png // 48x48 piksel
icon_96.png // 96x96 pikselLoading ve Error Handling
Loading Göstergesi
Image.asset(
'assets/images/logo.png',
frameBuilder: (context, child, frame, wasSynchronouslyLoaded) {
if (wasSynchronouslyLoaded) {
return child;
}
return AnimatedOpacity(
opacity: frame == null ? 0 : 1,
duration: Duration(milliseconds: 300),
curve: Curves.easeOut,
child: child,
);
},
)Hata Durumu
Image.asset(
'assets/images/logo.png',
errorBuilder: (context, error, stackTrace) {
return Container(
color: Colors.grey[300],
child: Center(
child: Icon(Icons.error, color: Colors.red),
),
);
},
)Image.network vs Image.asset
Image.asset (Yerel Resim)
Image.asset('assets/images/logo.png')- Projeye dahildir
- İnternet gerektirmez
- Hızlı yüklenir
- Uygulama boyutunu artırır
Image.network (İnternetten Resim)
Image.network('https://example.com/image.png')- İnternetten indirilir
- İnternet bağlantısı gerektirir
- Yavaş olabilir
- Uygulama boyutunu artırmaz
- Cache yapılabilir
FadeInImage ile Smooth Loading
FadeInImage(
placeholder: AssetImage('assets/images/placeholder.png'),
image: NetworkImage('https://example.com/image.png'),
fit: BoxFit.cover,
)veya yerel resimler için:
FadeInImage(
placeholder: AssetImage('assets/images/loading.gif'),
image: AssetImage('assets/images/photo.jpg'),
)SVG Resimler
SVG resimler için flutter_svg paketi gereklidir:
pubspec.yaml
dependencies:
flutter_svg: ^2.0.0Kullanımı
import 'package:flutter_svg/flutter_svg.dart';
SvgPicture.asset(
'assets/images/logo.svg',
width: 100,
height: 100,
)Cached Network Image
Network resimlerini cache'lemek için cached_network_image paketi:
pubspec.yaml
dependencies:
cached_network_image: ^3.3.0Kullanımı
import 'package:cached_network_image/cached_network_image.dart';
CachedNetworkImage(
imageUrl: 'https://example.com/image.png',
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
)Sık Yapılan Hatalar
1. pubspec.yaml Girintisi
# ❌ YANLIŞ
flutter:
uses-material-design: true
assets:
- assets/images/
# ✅ DOĞRU
flutter:
uses-material-design: true
assets:
- assets/images/Girintiler önemlidir! 2 veya 4 boşluk kullanın.
2. Yol Hatası
// ❌ YANLIŞ
Image.asset('images/logo.png') // 'assets/' eksik
// ✅ DOĞRU
Image.asset('assets/images/logo.png')3. Dosya Adı Büyük/Küçük Harf
// logo.PNG vs logo.png
// Dosya sisteminiz case-sensitive olabilir4. Hot Reload Sorunu
pubspec.yaml değişiklikleri için:
- Hot reload yeterli değil
- Hot restart yapın (🔄 butonu)
- Veya uygulamayı tamamen durdurup başlatın
Özet
Flutter'da resim eklemek:
- Klasör oluştur:
assets/images/ - Resimleri ekle: PNG, JPG, SVG, vb.
- pubspec.yaml'a tanımla:
flutter: assets: - assets/images/ - Hot restart yap
- Kullan:
Image.asset('assets/images/logo.png')
Öneriler:
- Çoklu çözünürlük için
1.5x,2.0x,3.0xklasörleri oluşturun - Anlamlı dosya isimleri kullanın
- Büyük resimleri optimize edin
- SVG resimler için
flutter_svgkullanın - Network resimleri için
cached_network_imagekullanın
Performans İpuçları:
- Gereksiz büyük resimlerden kaçının
- WebP formatı daha küçük dosya boyutu sağlar
- Kullanılmayan resimleri kaldırın
- Lazy loading uygulayın
Resimler, Flutter uygulamalarının görsel kimliğinin önemli bir parçasıdır. Doğru kullanıldığında uygulamanızı profesyonel ve çekici hale getirir!
İlgili Yazılar
Flutter'da Kamerayı Kullanıcıya Bırakmak: Yön Zorlamadan Video Çekmek
Flutter camera paketinde önizlemenin ters dönmesi, kayıt başlarken donma ve bildirim merkezi açılınca kameranın kilitlenmesi. Recapday'i geliştirirken çözdüğüm üç somut hatayı ve yön zorlamadan çalışan kamera ekranının kodunu anlatıyorum.
Firebase Auth + Kendi PHP Sunucun: Composer Olmadan Token Doğrulama ve Hesap Silme
Kimlik Firebase'de, veri kendi sunucunuzda. Peki PHP tarafı gelen jetona nasıl güvenecek? Paylaşımlı hostingte composer olmadan RS256 doğrulaması ve mağazaların zorunlu tuttuğu hesap silme akışının tam kurulumu.
ffmpeg ile Telefonda Video Birleştirme: Farklı Oranlardaki Klipleri Tek Vloga Çevirmek
Kimi dikey kimi yatay, kimi video kimi fotoğraf. Recapday'de bu karışımı sunucu kullanmadan, telefonda tek bir 1920x1080 vloga çeviren ffmpeg zincirini adım adım anlatıyorum: bulanık dolgu, Türkçe karakterli yazı, müzik ve ölçülmüş sıkıştırma.