اتصال فلاتر به سرور با Dio: مدلها، خطاها و ساختار تمیز
هر اپ واقعی با یک API حرف میزند. این راهنما نشان میدهد چطور با Dio درخواست بزنید، پاسخها را به مدل Dart تبدیل کنید، خطاها را درست مدیریت کنید و کد شبکه را در یک لایهی تمیز نگه دارید.
وقتی اپ بزرگ میشود، بدون ساختار مشخص کد به هم میریزد. این مقاله ساختار feature-first، لایههای UI، state، repository و data source و اصول تستپذیری را به زبان ساده توضیح میدهد.

اپهای کوچک را میشود در چند فایل نوشت. ولی وقتی اپ بزرگ میشود و چند نفر روی آن کار میکنند، بدون ساختار مشخص هر تغییر ساده خطرناک میشود. معماری تمیز یعنی هر بخش از کد یک مسئولیت روشن دارد.
بهجای دستهبندی بر اساس نوع فایل (همهی ویجتها یکجا، همهی مدلها یکجا)، بر اساس قابلیت دستهبندی کنید:
lib/
core/ # shared: network, theme, utils
features/
auth/
data/ # api + repository implementation
domain/ # models + repository interface
presentation/# screens, widgets, controllers
courses/
data/
domain/
presentation/
main.dartمزیتش این است که برای کار روی یک قابلیت فقط در یک پوشه میگردید و حذف یا جابهجایی یک قابلیت آسان میشود.
abstract class CourseRepository {
Future<List<Course>> fetchCourses();
}
class ApiCourseRepository implements CourseRepository {
ApiCourseRepository(this._api);
final CourseApi _api;
@override
Future<List<Course>> fetchCourses() => _api.getCourses();
}چرا واسط؟ چون در تست، یک FakeCourseRepository میگذارید و بدون اینترنت رفتار صفحه را تست میکنید.
کلاسها نباید وابستگیهایشان را خودشان بسازند؛ از بیرون بگیرند. با سازنده یا با Riverpod:
final courseRepositoryProvider = Provider<CourseRepository>(
(ref) => ApiCourseRepository(ref.watch(courseApiProvider)),
);مدلها را final و const تعریف کنید و برای تغییر، نسخهی جدید بسازید (copyWith). این کار باگهای ناشی از تغییر پنهان داده را از بین میبرد.
برای یک اپ ۳ صفحهای لازم نیست چهار لایه بسازید. با ساده شروع کنید و وقتی درد را حس کردید لایه اضافه کنید. معماری باید به شما سرعت بدهد، نه اینکه کند کند.
اگر یک چیز یاد بگیرید: UI را از منطق و داده جدا کنید. بقیهی چیزها همینجا شروع میشود.
دورهی VIP فست فلاتر از صفر تا انتشار اپلیکیشن، با پشتیبانی مستقیم مدرس.