✅ مقدمة عن 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