الگوهای طراحی در Flutter MVVM

هدف: الگوی MVVM (Model-View-ViewModel) برای جداسازی UI (View) از منطق تجاری و داده ها (Model) در برنامه های Flutter استفاده می شود. این جداسازی قابلیت نگهداری، تست پذیری و مقیاس پذیری کد را بهبود می بخشد.
مفاهیم اصلی:
مدل: نشان دهنده داده ها و منطق تجاری است.
View: داده ها را نمایش می دهد و به تعاملات کاربر گوش می دهد.
ViewModel: به عنوان یک واسطه بین View و Model عمل می کند. منطق ارائه را مدیریت می کند و داده ها را در معرض View قرار می دهد.
مزایا:
جداسازی نگرانی ها: کد UI را جدا از منطق تجاری نگه می دارد.
تست پذیری: تست منطق تجاری و UI را به طور جداگانه آسان تر می کند.
قابلیت نگهداری: پایگاه کد را ساده می کند و نگهداری آن را آسان تر می کند.
کد مثال:
بیایید یک برنامه شمارنده ساده با استفاده از الگوی MVVM ایجاد کنیم.
مرحله 1: ایجاد مدل
// models/counter_model.dart
class CounterModel {
int counter;
CounterModel({this.counter = 0});
}
مرحله 2: ViewModel را ایجاد کنید
// viewmodels/counter_view_model.dart
import 'package:flutter/material.dart';
import '../models/counter_model.dart';
class CounterViewModel extends ChangeNotifier {
CounterModel _counterModel = CounterModel();
int get counter => _counterModel.counter;
void increment() {
_counterModel.counter++;
notifyListeners();
}
void decrement() {
_counterModel.counter--;
notifyListeners();
}
}
مرحله 3: ViewModel را ارائه دهید
ویجت برنامه اصلی خود را با ChangeNotifierProvider بپیچید:
// main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'viewmodels/counter_view_model.dart';
import 'views/counter_page.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterViewModel(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterPage(),
);
}
}
مرحله 4: نمای را ایجاد کنید
از ویجت Consumer برای گوش دادن به تغییرات و بازسازی رابط کاربری استفاده کنید:
// views/counter_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../viewmodels/counter_view_model.dart';
class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MVVM Counter'),
),
body: Center(
child: Consumer(
builder: (context, counterViewModel, child) {
return Text(
'Counter: ${counterViewModel.counter}',
style: TextStyle(fontSize: 24),
);
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () => context.read().increment(),
child: Icon(Icons.add),
),
SizedBox(height: 8),
FloatingActionButton(
onPressed: () => context.read().decrement(),
child: Icon(Icons.remove),
),
],
),
);
}
}
در این مثال، کلاس CounterModel داده ها را نگه می دارد. کلاس CounterViewModel به عنوان یک واسطه بین مدل و UI عمل می کند و منطق ارائه را مدیریت می کند. ویجت CounterPage View است که از CounterViewModel برای نمایش و تعامل با داده های شمارنده استفاده می کند.
با استفاده از الگوی MVVM، ما به تفکیک تمیزی از نگرانیها دست پیدا میکنیم و کد ما را قابل نگهداری و آزمایشپذیرتر میکنیم.