DEV Community

Cover image for নতুন Flutter ডেভেলপারদের জন্য সেরা স্টেট ম্যানেজমেন্ট: একটি প্রারম্ভিক গাইড উদাহরণসহ
Mehedi Hasan
Mehedi Hasan

Posted on

নতুন Flutter ডেভেলপারদের জন্য সেরা স্টেট ম্যানেজমেন্ট: একটি প্রারম্ভিক গাইড উদাহরণসহ

যখন আপনি প্রথম Flutter-এ অ্যাপ তৈরি করতে শুরু করেন, তখন আপনার অ্যাপের স্টেট কীভাবে ম্যানেজ করবেন, তা বুঝতে কিছুটা বিভ্রান্তিকর হতে পারে। স্টেট ম্যানেজমেন্ট গুরুত্বপূর্ণ কারণ এটি নিশ্চিত করে যে আপনার অ্যাপের UI ডেটাতে পরিবর্তন হওয়ার সাথে সাথে সঠিকভাবে প্রতিক্রিয়া জানায়। কিন্তু একটি নতুন ডেভেলপার হিসেবে, আপনি কোন পদ্ধতি ব্যবহার করবেন তা ঠিক করা কঠিন হতে পারে। আপনি কি Provider ব্যবহার করবেন? Riverpod, GetX বা Bloc সম্পর্কে কী?

এই আর্টিকেলে, আমি আপনাকে বিভিন্ন স্টেট ম্যানেজমেন্ট পদ্ধতি নিয়ে পরিচিত করাবো, সবচেয়ে সহজ পদ্ধতি (যেমন setState) থেকে শুরু করে আরও উন্নত পদ্ধতিগুলি পর্যন্ত। আমি বাস্তব উদাহরণও দেব, যাতে আপনি দেখতে পারেন প্রতিটি পদ্ধতি কীভাবে কাজ করে।

স্টেট ম্যানেজমেন্ট কেন গুরুত্বপূর্ণ?

একটি সাধারণ Flutter অ্যাপে, স্টেট পরিবর্তন প্রতিটি স্থানে ঘটে। একটি শপিং অ্যাপ কল্পনা করুন: যখন আপনি কার্টে আইটেম যোগ করেন, তখন মোট মূল্য আপডেট হওয়া উচিত। যদি আপনি একটি সোশ্যাল মিডিয়া অ্যাপ তৈরি করেন, তাহলে যখন কেউ একটি পোস্টে মন্তব্য করে, তখন মন্তব্যটি অবিলম্বে অ্যাপ রিফ্রেশ না করেই দেখা উচিত।

যদি সঠিকভাবে স্টেট ম্যানেজমেন্ট না করা হয়, তবে আপনার অ্যাপ পরিবর্তনগুলির প্রতি সঠিকভাবে প্রতিক্রিয়া জানাবে না এবং ব্যবহারকারীর অভিজ্ঞতা হতাশাজনক হতে পারে।

নতুনদের জন্য স্টেট ম্যানেজমেন্ট অপশনগুলির পর্যালোচনা

Flutter অনেকগুলি উপায়ে স্টেট ম্যানেজ করতে দেয়, তবে এখানে কিছু জনপ্রিয় পদ্ধতির তালিকা দেওয়া হলো:

  • setState (বিল্ট-ইন, ছোট অ্যাপের জন্য)
  • Provider (নতুন ডেভেলপারদের জন্য আদর্শ, স্কেলযোগ্য)
  • Riverpod (Provider এর একটি উন্নত সংস্করণ)
  • GetX (সরল, ন্যূনতম বয়লারপ্লেট)
  • Bloc (বড় এবং জটিল অ্যাপের জন্য)

1. setState – Flutter এর বিল্ট-ইন স্টেট ম্যানেজমেন্ট

setState হল Flutter-এ স্টেট ম্যানেজ করার সবচেয়ে মৌলিক এবং সহজ পদ্ধতি। এটি ছোট অ্যাপস বা উইজেটগুলির জন্য উপযুক্ত, যেখানে স্টেট অনেক অংশে ভাগ করা হয় না।

উদাহরণ: Counter অ্যাপ 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),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

setState এর সুবিধা:

  • সহজে বুঝতে এবং ব্যবহার করতে পারেন।
  • ছোট, লোকালাইজড স্টেট পরিবর্তনের জন্য সেরা।

সামান্য অসুবিধা:

  • বড় অ্যাপের জন্য স্কেলযোগ্য নয়।
  • যদি স্টেট অনেক উইজেটে ভাগ করতে হয়, তবে এটি অপ্রত্যাশিতভাবে জটিল হতে পারে।

2. Provider – নতুনদের জন্য আদর্শ

Provider নতুন ডেভেলপারদের জন্য একটি সহজ এবং জনপ্রিয় পদ্ধতি। এটি Flutter টিমের দ্বারা অফিসিয়ালি সুপারিশ করা হয়েছে এবং অ্যাপের বিভিন্ন অংশে স্টেট শেয়ার করার জন্য কার্যকরী।

উদাহরণ: Counter অ্যাপ Provider দিয়ে

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(),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Provider এর সুবিধা:

  • শেখা এবং ব্যবহার করা সহজ।
  • Flutter দ্বারা সুপারিশিত।
  • অ্যাপ বৃদ্ধি পেলে স্কেলযোগ্য।

সামান্য অসুবিধা:

  • setState এর তুলনায় কিছুটা বেশি সেটআপ প্রয়োজন।

3. Riverpod – Provider এর পরবর্তী স্তর

যদি আপনি Provider এ অভ্যস্ত হয়ে থাকেন, তবে Riverpod পরবর্তী পদক্ষেপ। এটি Provider এর কিছু সীমাবদ্ধতা ঠিক করে এবং আরও বেশি নমনীয় করে তোলে। 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(),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Riverpod এর সুবিধা:

  • Provider এর চেয়ে শক্তিশালী।
  • বড় অ্যাপের জন্য উপযুক্ত।
  • Provider এর সাধারণ ভুলগুলো দূর করে।

সামান্য অসুবিধা:

  • Provider এর চেয়ে কিছুটা জটিল।

4. GetX – ন্যূনতম বয়লারপ্লেট

GetX একটি জনপ্রিয় স্টেট ম্যানেজমেন্ট সলিউশন, যা সহজ এবং ন্যূনতম বয়লারপ্লেট প্রয়োজন। এটি স্টেট ম্যানেজমেন্ট, ডিপেন্ডেন্সি ইনজেকশন, এবং রাউটিংকে এক প্যাকেজে একত্রিত করে, যা ছোট থেকে মাঝারি অ্যাপগুলি দ্রুত তৈরি করার জন্য উপযুক্ত।

উদাহরণ: GetX দিয়ে Counter অ্যাপ

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,
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

GetX এর সুবিধা:

  • ন্যূনতম সেটআপ এবং বয়লারপ্লেট।
  • এক প্যাকেজে একাধিক কার্যকারিতা একত্রিত করে।

সামান্য অসুবিধা:

  • বড় অ্যাপগুলিতে জটিল হয়ে উঠতে পারে।
  • কিছু ডেভেলপার "অল-ইন-ওয়ান" পদ্ধতিটি সীমাবদ্ধ মনে করেন।

5. Bloc – বড়, জটিল অ্যাপসের জন্য

Bloc একটি শক্তিশালী স্টেট ম্যানেজমেন্ট সলিউশন, যা Business Logic Component (BLoC) প্যাটার্ন অনুসরণ করে এবং সেই অ্যাপগুলির জন্য উপযুক্ত যেখানে UI এবং বিজনেস লজিকের মধ্যে স্পষ্ট পৃথকীকরণ প্রয়োজন। এটি শেখা কঠিন হতে পারে, কিন্তু বড় অ্যাপগুলির জন্য খুব শক্তিশালী।

উপসংহার

আপনার অ্যাপের জটিলতা এবং Flutter নিয়ে আপনার অভিজ্ঞতার উপর নির্ভর করে সঠিক স্টেট ম্যানেজমেন্ট পদ্ধতি চয়ন করা গুরুত্বপূর্ণ।

  • ছোট অ্যাপ বা নতুন ডেভেলপারদের জন্য: setState এবং Provider সেরা প্রারম্ভিক পদ্ধতি।
  • আরও জটিল অ্যাপসের জন্য: Riverpod, GetX অথবা Bloc যথাযথ পদ্ধতি।

আপনি যত বেশি প্রকল্প তৈরি করবেন, ততই বিভিন্ন সলিউশন পরীক্ষা করে দেখুন, যাতে আপনি বুঝতে পারেন কোনটি আপনার জন্য সবচেয়ে ভালো!

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

AWS Q Developer image

Your AI Code Assistant

Automate your code reviews. Catch bugs before your coworkers. Fix security issues in your code. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay