تكرار السؤال: …
الإجابة المختصرة
يعتمد MVVM عادة على عدة تدفقات لحالات مستقلة، بينما يفرض MVI حالة موحدة وحيدة غير قابلة للتعديل (Single Immutable State) مع تدفق صارم للأحداث (Intents) والآثار الجانبية (Side Effects).
الشرح
في MVVM التقليدي قد تجد isLoading و users و errorMessage كـ StateFlows منفصلة، مما قد يسبب حالات غير متناسقة أحيانًا. في MVI (Model-View-Intent) تُمثل شاشة العرض كحالة واحدة شاملة عبر data class أو sealed interface، ويتم استقبال رغبات المستخدم كـ Intent والتعبير عن الأحداث الفردية السريعة (مثل التنقل أو عرض Snackbar) كـ Single-event Side Effects.
مثال بالكود
// MVI State
data class ProfileState(
val isLoading: Boolean = false,
val profile: Profile? = null,
val error: String? = null
)
// MVI Intent
sealed interface ProfileIntent {
data object Load : ProfileIntent
data class UpdateBio(val newBio: String) : ProfileIntent
}أخطاء شائعة
- إعادة إرسال نفس الحدث العابر (One-off Event) كإظهار Toast في كل مرة يعاد فيها تكوين الواجهة في MVI لعدم عزله عن State.