✅ مقدمة عن Image في Flutter
الـ Image هي ويدجت تُستخدم لعرض الصور على واجهة المستخدم. يمكن تحميل الصور من:
- الملفات المحلية
- الإنترنت
- الذاكرة Memory
- الملفات assets
- الصورة ككائن Uint8List
✅ أنواع إنشاء صورة (Constructors)
1. Image.asset()
تحميل صورة من مجلد
assets
Image.asset(
'assets/images/logo.png',
width: 100,
height: 100,
)Dart✅ ملاحظات:
- يجب تعريف الصورة في
pubspec.yaml. - مناسب للصور التي تأتي مع التطبيق.
2. Image.network()
تحميل صورة من الإنترنت
Image.network(
'https://example.com/image.png',
loadingBuilder: (context, child, progress) {
return progress == null ? child : CircularProgressIndicator();
},
errorBuilder: (context, error, stackTrace) {
return Icon(Icons.error);
},
)Dart✅ ملاحظات:
- يدعم تحميل الصور بشكل غير متزامن.
- يمكن التعامل مع حالات الخطأ أو التحميل.
- تأكد من صلاحية الوصول إلى الإنترنت.
3. Image.file()
تحميل صورة من ملف محلي (مثلاً من
File PickerأوCamera)
Image.file(
File('/path/to/image.png'),
)Dart✅ ملاحظات:
- تحتاج صلاحية للوصول للملفات.
4. Image.memory()
تحميل صورة من بيانات ثنائية (Uint8List)
Image.memory(
imageBytes,
)Dart✅ ملاحظات:
- مناسب للصور القادمة من API ترجع الصورة كبايتات.
5. Image.networkUrl() [تجريبية]
مثل
Image.networkلكن تستخدمUriبدلString.
Image.networkUrl(
Uri.parse('https://example.com/image.png'),
)Dart✅ الخصائص (Properties)
| الخاصية | الوصف |
|---|---|
width / height | عرض وارتفاع الصورة. |
fit | طريقة ملاءمة الصورة داخل الصندوق (BoxFit). |
alignment | محاذاة الصورة داخل المساحة المتوفرة. |
color | صبغ الصورة بلون محدد (تُستخدم مع colorBlendMode). |
colorBlendMode | طريقة دمج اللون مع الصورة. |
repeat | تكرار الصورة في المحور الأفقي أو العمودي أو كلاهما (ImageRepeat). |
filterQuality | جودة تصفية الصورة (low, medium, high). |
semanticLabel | وصف بديل للصورة (مفيد لذوي الاحتياجات الخاصة). |
isAntiAlias | هل تُستخدم تقنية Anti-Aliasing أم لا. |
matchTextDirection | هل تعكس اتجاه الصورة عند تغيير اتجاه النص (للدعم RTL). |
✅ BoxFit (خاصية fit)
| القيمة | التأثير |
|---|---|
BoxFit.fill | يملأ الصورة بشكل كامل مع احتمال التشويه. |
BoxFit.contain | تناسب الحجم كاملاً مع الحفاظ على الأبعاد (قد تترك فراغ). |
BoxFit.cover | تغطي الصورة كامل الصندوق مع احتمال القص. |
BoxFit.fitWidth | تناسب العرض فقط، قد تقطع الارتفاع. |
BoxFit.fitHeight | تناسب الارتفاع فقط، قد تقطع العرض. |
BoxFit.none | لا يتم تغيير حجم الصورة. |
BoxFit.scaleDown | مثل none ولكن تُصغر إذا كانت أكبر من الصندوق. |
✅ ImageRepeat
| القيمة | التأثير |
|---|---|
ImageRepeat.noRepeat | لا تُكرر الصورة (افتراضي). |
ImageRepeat.repeatX | تُكرر أفقيًا. |
ImageRepeat.repeatY | تُكرر عموديًا. |
ImageRepeat.repeat | تُكرر في كلا الاتجاهين. |
✅ مثال شامل
Image.asset(
'assets/images/flutter.png',
width: 200,
height: 200,
fit: BoxFit.cover,
alignment: Alignment.center,
color: Colors.red.withOpacity(0.5),
colorBlendMode: BlendMode.darken,
repeat: ImageRepeat.noRepeat,
filterQuality: FilterQuality.high,
semanticLabel: 'Flutter Logo',
)Dart✅ التعامل مع التحميل والأخطاء (لـ Image.network)
Image.network(
'https://example.com/photo.png',
loadingBuilder: (context, child, loadingProgress) {
if (loadingProgress == null) return child;
return Center(child: CircularProgressIndicator());
},
errorBuilder: (context, error, stackTrace) {
return Icon(Icons.error);
},
)Dart✅ ملاحظات مهمة
- الصور من
assetsيجب تعريفها فيpubspec.yaml. - عند استخدام
Image.networkيفضل إضافةloadingBuilderوerrorBuilderلتحسين تجربة المستخدم. fitهي من أهم الخصائص لتحديد كيف ستظهر الصورة.filterQualityيمكن أن يؤثر على أداء التطبيق إذا تم ضبطه علىhigh.- لا تنسَ استخدام الصور المضغوطة للحفاظ على الأداء.
✅ نصيحة لتحسين الأداء
- استخدم
CachedNetworkImageبدلاً منImage.networkلتخزين الصور مؤقتًا:
CachedNetworkImage(
imageUrl: 'https://example.com/image.png',
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
)Dart✅ الخلاصة
| الشيء | المحتوى |
|---|---|
| الأنواع | asset, network, file, memory, networkUrl |
| أهم الخصائص | width, height, fit, alignment, repeat, color, colorBlendMode |
| التخصيص | loadingBuilder, errorBuilder |
| التوافق | RTL, وصف سمعي, أداء, تحكم كامل بالمظهر |
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "Main App",
home: Scaffold(
drawer: Drawer(),
appBar: AppBar(title: Text("Main App"), elevation: 5),
body: Center(
child: Container(
width: 200,
height: 200,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
image: DecorationImage(image: AssetImage("images/z1.webp"), fit: BoxFit.cover)
),
)
),
),
);
}
}Dart