برنامه نویسی

الگوهای طراحی در 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، ما به تفکیک تمیزی از نگرانی‌ها دست پیدا می‌کنیم و کد ما را قابل نگهداری و آزمایش‌پذیرتر می‌کنیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا