برنامه نویسی

بهترین مدیریت دولت برای توسعه دهندگان جدید Flutter: با یک مثال راهنمای اولیه

هنگامی که برای اولین بار شروع به ایجاد یک برنامه در Flutter می کنید ، می تواند کمی گیج کننده باشد که چگونه می توانید وضعیت برنامه خود را مدیریت کنید. مدیریت دولت مهم است زیرا تضمین می کند که UI برنامه شما به محض تغییر داده های UI به درستی واکنش نشان می دهد. اما به عنوان یک توسعه دهنده جدید ، ممکن است تصمیم گیری در مورد چه روشی استفاده کنید. از چه ارائه دهنده ای استفاده می کنید؟ در مورد RiverPod ، GetX یا بلوک چیست؟

در این مقاله ، من شما را با روشهای مختلف مدیریت دولت ، از ساده ترین روش (مانند SetState) گرفته تا روشهای پیشرفته تر آشنا می کنم. من همچنین نمونه های واقعی را ارائه خواهم داد ، بنابراین می توانید ببینید که چگونه هر روش کار می کند.

چرا مدیریت دولت مهم است؟

در یک برنامه معمولی Flutter ، تغییرات حالت در همه جا رخ می دهد. یک برنامه خرید را تصور کنید: وقتی مورد را به سبد خرید اضافه می کنید ، قیمت کل باید به روز شود. اگر یک برنامه رسانه های اجتماعی ایجاد می کنید ، وقتی شخصی در مورد یک پست اظهار نظر می کند ، باید بدون اینکه برنامه را سریعاً تازه کنید ، نظر را مشاهده کنید.

اگر مدیریت دولت به درستی انجام نشود ، برنامه شما به درستی به تغییرات پاسخ نمی دهد و ممکن است تجربه کاربر ناامید کننده باشد.

بررسی گزینه های مدیریت دولت برای افراد تازه وارد

Flutter اجازه می دهد تا دولت را از بسیاری جهات مدیریت کند ، اما در اینجا لیستی از برخی از محبوب ترین روش ها وجود دارد:

  • SetState (داخلی ، برای برنامه های کوچک)
  • ارائه دهنده (ایده آل برای توسعه دهندگان جدید ، مقیاس پذیر)
  • RiverPod (نسخه پیشرفته ارائه دهنده)
  • getx (ساده ، حداقل دیگ بخار)
  • بلوک (برای برنامه های بزرگ و پیچیده)

1. مدیریت داخلی داخلی Setstate-Flutter

SetState اساسی ترین و ساده ترین روش مدیریت دولت در Flutter است. برای برنامه های کوچک یا ویجت ها مناسب است ، جایی که دولت در بسیاری از قسمت ها تقسیم نمی شود.

مثال: از طریق برنامه پیشخوان setState

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends StatefulWidget {
  @override
  _CounterScreenState createState() => _CounterScreenState();
}

class _CounterScreenState extends State<CounterScreen> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++;
    });
  }

  void _decrement() {
    setState(() {
      _count--;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter App')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count: $_count'),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                IconButton(icon: Icon(Icons.remove), onPressed: _decrement),
                IconButton(icon: Icon(Icons.add), onPressed: _increment),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مزیت SetState:

  • به راحتی می تواند درک و استفاده کند.
  • بهترین برای تغییر در کشورهای کوچک و بومی.

مشکل کوچک:

  • برای برنامه های بزرگ Scleble نیست.
  • اگر دولت باید به بسیاری از ابزارک ها تقسیم شود ، می تواند به طور غیر منتظره ای پیچیده باشد.

2. ارائه دهنده – ایده آل برای افراد تازه وارد

ارائه دهنده یک روش ساده و محبوب برای توسعه دهندگان جدید است. این امر به طور رسمی توسط تیم Flutter توصیه می شود و برای به اشتراک گذاشتن دولت در قسمت های مختلف برنامه مؤثر است.

مثال: با ارائه دهنده برنامه Counter

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Counter with ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void decrement() {
    _count--;
    notifyListeners();
  }
}

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => Counter(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Provider Example: Counter')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:'),
            Consumer<Counter>(
              builder: (context, counter, child) {
                return Text('${counter.count}');
              },
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                IconButton(
                  icon: Icon(Icons.remove),
                  onPressed: () => context.read<Counter>().decrement(),
                ),
                IconButton(
                  icon: Icon(Icons.add),
                  onPressed: () => context.read<Counter>().increment(),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مزیت ارائه دهنده:

  • یادگیری و استفاده آسان
  • توسط Flutter توصیه می شود.
  • در صورت افزایش برنامه مقیاس پذیر است.

مشکل کوچک:

  • SetState به تنظیم کمی بیشتر نیاز دارد.

3. Riverpod – سطح بعدی ارائه دهنده

اگر به ارائه دهنده عادت کرده اید ، RiverPod مرحله بعدی است. این محدودیت های ارائه دهنده را برطرف می کند و آن را حتی انعطاف پذیر تر می کند. آزمایش RiverPod آسان است و برخی از اشتباهات رایج مانند درخت ویجت ، از مشکل از دست دادن دولت هنگام ساخت مجدد جلوگیری می کند.

مثال: مدیریت دولت با RiverPod

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final counterProvider = StateNotifierProvider<Counter, int>((ref) => Counter());

class Counter extends StateNotifier<int> {
  Counter() : super(0);

  void increment() => state++;
  void decrement() => state--;
}

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Scaffold(
      appBar: AppBar(title: Text('Riverpod Example: Counter')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count: $count'),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                IconButton(
                  icon: Icon(Icons.remove),
                  onPressed: () => ref.read(counterProvider.notifier).decrement(),
                ),
                IconButton(
                  icon: Icon(Icons.add),
                  onPressed: () => ref.read(counterProvider.notifier).increment(),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مزیت Riverpod:

  • قوی تر از ارائه دهنده.
  • مناسب برای برنامه های بزرگ.
  • اشتباهات رایج ارائه دهنده را از بین می برد.

مشکل کوچک:

  • تا حدودی پیچیده تر از ارائه دهنده.

4. getx – حداقل دیگ بخار

GetX یک راه حل محبوب مدیریت دولت است که به دیگ بخار ساده و حداقل نیاز دارد. این ترکیب مدیریت دولت ، تزریق وابستگی و مسیریابی در یک بسته است که برای سریعتر برنامه های کوچک و متوسط ​​مناسب است.

مثال: برنامه پیشخوان با getx

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class CounterController extends GetxController {
  var count = 0.obs;

  void increment() => count++;
  void decrement() => count--;
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends StatelessWidget {
  final CounterController controller = Get.put(CounterController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('GetX Example: Counter')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:'),
            Obx(() => Text('${controller.count}')),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                IconButton(
                  icon: Icon(Icons.remove),
                  onPressed: controller.decrement,
                ),
                IconButton(
                  icon: Icon(Icons.add),
                  onPressed: controller.increment,
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تسهیلات GETX:

  • حداقل تنظیم و دیگ بخار.
  • عملکردهای متعدد را در یک بسته ترکیب می کند.

مشکل کوچک:

  • برنامه های بزرگ می توانند پیچیده شوند.
  • برخی از توسعه دهندگان فکر می کنند که روش “همه در یک” محدود است.

5. بلوک – برای برنامه های بزرگ و پیچیده

بلوک یک راه حل قدرتمند مدیریت دولت است ، که از الگوی مؤلفه منطق تجارت (Bloc) پیروی می کند و برای برنامه هایی مناسب است که جدایی واضح بین UI و منطق کسب و کار لازم است. یادگیری آن دشوار است ، اما برای برنامه های بزرگ بسیار قوی است.

پایان

مهم است که بسته به تجربه برنامه خود و تجربه خود در مورد Flutter ، روش صحیح مدیریت حالت را انتخاب کنید.

  • برای برنامه های کوچک یا توسعه دهندگان جدید: چافت وت ارائه دهنده بهترین روش اولیه.
  • برای برنامه های پیچیده تر: رودخانهبا getx یا جبهه روش مناسب

هرچه پروژه ای که ایجاد می کنید بیشتر راه حل های مختلف را بررسی کنید ، بنابراین می توانید درک کنید که کدام یک برای شما بهتر است!

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

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

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

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