Flutter এ State Management

Mobile App Development - ফ্লাটার (Flutter)
263

Flutter এ State Management হলো অ্যাপ্লিকেশনের ডেটা বা স্টেট পরিচালনা করার প্রক্রিয়া। State Management ব্যবহৃত হয় যখন আপনি অ্যাপ্লিকেশনের বিভিন্ন উইজেটের মধ্যে ডেটা শেয়ার করতে বা ডাইনামিকভাবে UI আপডেট করতে চান। Flutter এ State Management করার জন্য বিভিন্ন পদ্ধতি রয়েছে, এবং এগুলো বিভিন্ন প্রেক্ষাপটে কার্যকরী হতে পারে। নিচে Flutter এ State Management এর বিভিন্ন পদ্ধতি এবং তাদের বৈশিষ্ট্য আলোচনা করা হলো।

State Management কী?

State হলো আপনার অ্যাপ্লিকেশনের ডেটা, যা ব্যবহারকারীর ইন্টারঅ্যাকশন বা অন্য কোনো কারণের ফলে পরিবর্তিত হতে পারে। Flutter এ State Management মূলত এই পরিবর্তনশীল ডেটা নিয়ন্ত্রণ করে এবং সেই ডেটা অনুযায়ী UI আপডেট করে।

Flutter এ State Management এর পদ্ধতি:

১. setState:

  • setState হলো Flutter এর সবচেয়ে সহজ এবং সাধারণ State Management পদ্ধতি। এটি Stateful Widget এর স্টেট আপডেট করে এবং UI রিফ্রেশ করে।
  • ব্যবহারক্ষেত্র: যখন স্টেট শুধুমাত্র একটি Widget বা তার চাইল্ড Widgets এ সীমাবদ্ধ থাকে।

setState এর উদাহরণ:

import 'package:flutter/material.dart';

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

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

class CounterApp extends StatefulWidget {
  @override
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Simple Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pressed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
  • setState ফাংশন _incrementCounter মেথডে ব্যবহার করা হয়েছে, যা _counter ভেরিয়েবলের মান আপডেট করে এবং UI পুনরায় রেন্ডার করে।

২. InheritedWidget:

  • InheritedWidget Flutter এ স্টেট শেয়ার করার জন্য ব্যবহৃত হয়, যখন আপনি প্যারেন্ট এবং তার চাইল্ড Widgets এর মধ্যে ডেটা শেয়ার করতে চান। এটি একটি Widget গঠন করে, যা চাইল্ড Widgets এর মধ্যে স্টেট প্রোপাগেট করে।
  • ব্যবহারক্ষেত্র: যখন স্টেট অনেক Widget বা UI ট্রিতে শেয়ার করা প্রয়োজন।

InheritedWidget এর উদাহরণ:

class CounterProvider extends InheritedWidget {
  final int counter;
  final Widget child;

  CounterProvider({required this.counter, required this.child}) : super(child: child);

  static CounterProvider? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<CounterProvider>();
  }

  @override
  bool updateShouldNotify(CounterProvider oldWidget) {
    return oldWidget.counter != counter;
  }
}
  • CounterProvider হলো একটি InheritedWidget, যা স্টেট শেয়ার করে এবং of মেথড ব্যবহার করে অ্যাক্সেস করা যায়।

৩. Provider Package:

  • Provider হলো Flutter এ জনপ্রিয় একটি State Management প্যাকেজ, যা InheritedWidget এর উপরে তৈরি হয়েছে। এটি স্টেট ম্যানেজমেন্টকে সহজ এবং পরিষ্কার করে তোলে।
  • ব্যবহারক্ষেত্র: মাঝারি থেকে বড় অ্যাপ্লিকেশনে যেখানে একাধিক Widget এর মধ্যে ডেটা শেয়ার করতে হয়।

Provider এর উদাহরণ:

প্রথমে provider প্যাকেজ ইনস্টল করতে হবে (pubspec.yaml এ যোগ করুন):

dependencies:
  provider: ^6.0.0
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

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

class Counter with ChangeNotifier {
  int _count = 0;

  int get count => _count;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Provider Example')),
        body: Center(
          child: Consumer<Counter>(
            builder: (context, counter, child) {
              return Text(
                'Count: ${counter.count}',
                style: TextStyle(fontSize: 24),
              );
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            Provider.of<Counter>(context, listen: false).increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}
  • ChangeNotifier: এটি একটি ক্লাস যা notifyListeners মেথড ব্যবহার করে স্টেট আপডেটের জন্য লিসেনারদের জানায়।
  • Consumer: এটি Provider থেকে ডেটা শোনে এবং সেই অনুযায়ী UI আপডেট করে।
  • ChangeNotifierProvider: এটি পুরো অ্যাপের মধ্যে Counter অবজেক্টটি শেয়ার করে।

৪. Riverpod:

  • Riverpod হলো Provider এর একটি উন্নত সংস্করণ, যা আরো নিরাপদ এবং নির্ভরযোগ্য State Management প্রদান করে।
  • ব্যবহারক্ষেত্র: মাঝারি থেকে বড় অ্যাপ্লিকেশনে, যেখানে সহজ এবং স্কেলেবল State Management প্রয়োজন।

৫. Bloc Pattern (Business Logic Component):

  • Bloc হলো Reactive Programming এর উপরে ভিত্তি করে তৈরি একটি স্টেট ম্যানেজমেন্ট প্যাটার্ন, যা ডেটা স্ট্রিম এবং ইভেন্ট-ভিত্তিক স্টেট ম্যানেজমেন্টে সহায়তা করে।
  • ব্যবহারক্ষেত্র: বড় এবং জটিল অ্যাপ্লিকেশন, যেখানে মোবাইল, ওয়েব, এবং ডেস্কটপ অ্যাপ্লিকেশন একসাথে ব্যবহৃত হয়।

৬. GetX:

  • GetX একটি lightweight এবং দ্রুত State Management সলিউশন, যা Dependency Management এবং Routing এর সুবিধা দেয়।
  • ব্যবহারক্ষেত্র: ছোট থেকে বড় অ্যাপ্লিকেশন যেখানে সহজ স্টেট ম্যানেজমেন্ট, ডিপেন্ডেন্সি ম্যানেজমেন্ট, এবং নেভিগেশন প্রয়োজন।

State Management এর পদ্ধতির সংক্ষিপ্ত তুলনা:

পদ্ধতিউপযুক্ত ক্ষেত্রেসুবিধা
setStateছোট এবং সহজ Stateful Widget ব্যবহারেদ্রুত এবং সহজ, কোড পরিষ্কার
InheritedWidgetপ্যারেন্ট-চাইল্ড Widget এ স্টেট শেয়ার করাপ্রাথমিক Flutter সমাধান
Providerছোট থেকে মাঝারি অ্যাপ্লিকেশনসহজ এবং স্কেলেবল
Riverpodমাঝারি থেকে বড় অ্যাপ্লিকেশনProvider এর উপর উন্নত সমাধান
Blocজটিল এবং বড় অ্যাপ্লিকেশনReactive এবং স্কেলেবল, প্ল্যাটফর্ম নিরপেক্ষ
GetXছোট থেকে বড় অ্যাপ্লিকেশনদ্রুত, lightweight এবং ব্যবহার করা সহজ

State Management এর উপসংহার:

Flutter এ State Management খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনের ডাইনামিক এবং ইন্টারেকটিভ ফিচার পরিচালনা করে। ছোট অ্যাপের জন্য setState বা Provider উপযুক্ত, তবে বড় এবং জটিল অ্যাপ্লিকেশনের জন্য Bloc, Riverpod, বা GetX পদ্ধতি ব্যবহার করা বেশি কার্যকর।

Content added By

State Management এর ধারণা এবং প্রয়োজনীয়তা

254

Flutter-এ State Management হলো একটি প্রক্রিয়া যা অ্যাপ্লিকেশনের অবস্থা বা স্টেট পরিচালনা করতে ব্যবহৃত হয়। অ্যাপ্লিকেশনের বিভিন্ন স্ক্রিন, উইজেট, এবং ব্যবহারকারী ইন্টারঅ্যাকশনের সময় স্টেট পরিবর্তন হয়। এই পরিবর্তনগুলো সঠিকভাবে ম্যানেজ করতে পারা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের কর্মক্ষমতা, ডাটা হ্যান্ডলিং, এবং UI আপডেট নিশ্চিত করে।

State Management এর ধারণা

Flutter-এ State হলো কোনো উইজেট বা UI উপাদানের ডেটা যা পরিবর্তন হতে পারে। যেমন:

  • বাটনে ক্লিক করা হলে কোনো টেক্সট পরিবর্তিত হওয়া
  • ডাটাবেস বা API থেকে নতুন ডেটা আসা এবং UI তে তা আপডেট করা
  • একটি ফর্মে ডেটা ইনপুট করার সময় ভ্যালিডেশন করা

State Management মূলত এই পরিবর্তনগুলোকে কার্যকরভাবে পরিচালনা করা এবং UI কে সঠিকভাবে আপডেট করার প্রক্রিয়া। এটি নিশ্চিত করে যে অ্যাপ্লিকেশনের প্রতিটি উইজেট এবং স্ক্রিন সঠিক অবস্থায় রয়েছে এবং ব্যবহারকারী ইন্টারঅ্যাকশনের সাথে সঙ্গতি রেখে তা আপডেট হচ্ছে।

State এর ধরন

Flutter-এ দুই ধরনের State ব্যবহৃত হয়:

Ephemeral State (স্থানীয় বা অস্থায়ী স্টেট):

  • এটি একটি উইজেটের অভ্যন্তরীণ স্টেট, যা একটি নির্দিষ্ট উইজেট বা স্ক্রিনের জন্য সীমাবদ্ধ থাকে।
  • উদাহরণ: একটি বাটনে ক্লিক করে কাউন্টার ইনক্রিমেন্ট করা।
  • এ ধরনের স্টেট সাধারণত StatefulWidget এর মাধ্যমে পরিচালনা করা হয়।

App State (গ্লোবাল বা অ্যাপ স্টেট):

  • এটি অ্যাপ্লিকেশনের এক বা একাধিক স্ক্রিন বা উইজেটের মধ্যে শেয়ার করা স্টেট।
  • উদাহরণ: ব্যবহারকারীর লগইন অবস্থা, ডাটাবেস থেকে আসা প্রোডাক্ট লিস্ট, বা থিম মুড (ডার্ক/লাইট)।
  • এ ধরনের স্টেট ম্যানেজ করতে বিভিন্ন স্টেট ম্যানেজমেন্ট টুল বা লাইব্রেরি ব্যবহৃত হয়, যেমন Provider, Riverpod, Bloc, বা Redux

State Management এর প্রয়োজনীয়তা

State Management ব্যবহার করার কয়েকটি কারণ হলো:

UI আপডেট করা:

  • যখনই অ্যাপ্লিকেশনের ডেটা পরিবর্তিত হয়, তখন সেই পরিবর্তনের সাথে মিল রেখে UI আপডেট হওয়া প্রয়োজন। State Management এই পরিবর্তনগুলো সঠিকভাবে ম্যানেজ করে এবং UI কে রিফ্রেশ করে।

ডেটা হ্যান্ডলিং সহজ করা:

  • অ্যাপ্লিকেশনের বিভিন্ন স্থানে (যেমন স্ক্রিন বা উইজেটে) ডেটা একসঙ্গে ব্যবহার করা প্রয়োজন হতে পারে। State Management সেই ডেটা অ্যাক্সেস এবং ম্যানেজ করা সহজ করে।

কোড পুনঃব্যবহারযোগ্য এবং পরিষ্কার রাখা:

  • Flutter-এ সঠিকভাবে স্টেট ম্যানেজ করলে কোড আরও সংগঠিত এবং পরিষ্কার হয়। এটি অ্যাপ্লিকেশনের রক্ষণাবেক্ষণ সহজ করে।

ব্যবহারকারীর ইন্টারঅ্যাকশন এবং ডায়নামিক আপডেট পরিচালনা করা:

  • ব্যবহারকারীর অ্যাকশন অনুযায়ী (যেমন ফর্ম পূরণ, বাটন ক্লিক, বা লিস্ট থেকে আইটেম নির্বাচন) অ্যাপ্লিকেশনের বিভিন্ন অংশে পরিবর্তন হতে পারে। State Management এর মাধ্যমে সেই ইন্টারঅ্যাকশনগুলো সহজে এবং কার্যকরভাবে পরিচালনা করা যায়।

State Management এর বিভিন্ন পদ্ধতি

Flutter-এ স্টেট ম্যানেজ করার জন্য বেশ কিছু পদ্ধতি এবং লাইব্রেরি আছে। এগুলোর মধ্যে কয়েকটি জনপ্রিয় পদ্ধতি হলো:

setState:

  • এটি Flutter-এ সবচেয়ে বেসিক পদ্ধতি, যা StatefulWidget এর মাধ্যমে ব্যবহৃত হয়।
  • ছোট এবং সিম্পল অ্যাপ্লিকেশনের জন্য এটি ভালো কাজ করে।
  • উদাহরণ:
class CounterApp extends StatefulWidget {
  @override
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter App')),
      body: Center(child: Text('Counter: $_counter')),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        child: Icon(Icons.add),
      ),
    );
  }
}

Provider:

  • এটি Flutter-এ একটি জনপ্রিয় State Management প্যাকেজ, যা গ্লোবাল স্টেট ম্যানেজ করতে ব্যবহৃত হয়।
  • Provider ব্যবহার করে ডেটা বা স্টেট একাধিক উইজেট বা স্ক্রিনে সহজেই শেয়ার করা যায়।
  • এটি কোডকে সংগঠিত এবং পুনঃব্যবহারযোগ্য করে তোলে।

Riverpod:

  • এটি Provider-এর একটি উন্নত সংস্করণ এবং আরও ফ্লেক্সিবল। এটি গ্লোবাল স্টেট ম্যানেজ করার জন্য খুবই কার্যকর।
  • Riverpod Type-safe এবং কম্পাইল-টাইম সেফটি নিশ্চিত করে।

Bloc (Business Logic Component):

  • Flutter-এ একটি অত্যন্ত স্ট্রাকচার্ড State Management প্যাটার্ন।
  • এটি অ্যাপ্লিকেশনের লজিক এবং স্টেটকে সহজেই ম্যানেজ এবং টেস্ট করতে সহায়ক।
  • Bloc সাধারণত Streams এবং Events এর মাধ্যমে কাজ করে।

Redux:

  • একটি ফ্লাক্স-স্টাইল আর্কিটেকচার, যা State Management করার জন্য ব্যবহৃত হয়।
  • এটি বড় এবং কমপ্লেক্স অ্যাপ্লিকেশনের জন্য কার্যকর, তবে কোড কিছুটা জটিল হতে পারে।

State Management-এর একটি উদাহরণ: Provider ব্যবহার করা

Flutter-এ Provider প্যাকেজ ব্যবহার করে কিভাবে State ম্যানেজ করা যায় তার একটি উদাহরণ নিচে দেওয়া হলো:

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

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

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

class CounterModel with ChangeNotifier {
  int _counter = 0;

  int get counter => _counter;

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

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Provider Example')),
      body: Center(
        child: Consumer<CounterModel>(
          builder: (context, counterModel, child) {
            return Text('Counter: ${counterModel.counter}');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read<CounterModel>().increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

উদাহরণের ব্যাখ্যা:

  1. ChangeNotifierProvider: এটি CounterModel ক্লাসকে গ্লোবালি শেয়ার করতে ব্যবহার করা হয়েছে।
  2. ChangeNotifier: CounterModel ক্লাসে ChangeNotifier মিক্সিন ব্যবহার করা হয়েছে, যা স্টেট পরিবর্তিত হলে notifyListeners() কল করে UI আপডেট করে।
  3. Consumer: CounterModel এর ডেটা রিয়েল-টাইমে পাওয়ার জন্য Consumer উইজেট ব্যবহার করা হয়েছে।

Flutter এ State Management এর সারাংশ:

  • State Management অ্যাপ্লিকেশনের লজিক, ডেটা, এবং UI আপডেট পরিচালনা করে।
  • বিভিন্ন পদ্ধতির মধ্যে সবচেয়ে সহজ হলো setState, তবে বড় অ্যাপ্লিকেশনের জন্য Provider, Bloc, Riverpod বা Redux ব্যবহার করা কার্যকর।
  • State Management নিশ্চিত করে যে অ্যাপ্লিকেশনের প্রতিটি অংশ সঠিকভাবে কাজ করছে এবং UI আপডেট হচ্ছে।

এইভাবে, State Management Flutter-এ অ্যাপ্লিকেশনের স্ট্রাকচার এবং কার্যকারিতা নিশ্চিত করতে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।

Content added By

setState, InheritedWidget এবং Provider এর ব্যবহার

316

Flutter এ setState, InheritedWidget, এবং Provider হলো স্টেট ম্যানেজমেন্টের বিভিন্ন পদ্ধতি যা অ্যাপ্লিকেশনের স্টেট বা ডেটা পরিচালনা করতে ব্যবহার করা হয়। এগুলো বিভিন্ন পরিস্থিতিতে উপযোগী এবং কার্যকর। নিচে প্রতিটি পদ্ধতির ব্যবহার, ব্যাখ্যা, এবং উদাহরণ বিস্তারিতভাবে আলোচনা করা হলো।

১. setState:

  • setState হলো Flutter এ Stateful Widget এর স্টেট ম্যানেজমেন্টের সবচেয়ে সাধারণ পদ্ধতি। এটি ব্যবহার করে আপনি Widget এর স্টেট পরিবর্তন করে UI আপডেট করতে পারেন।
  • যখন আপনি setState মেথড কল করেন, তখন এটি নতুন ভ্যালু দিয়ে স্টেট আপডেট করে এবং UI পুনরায় রেন্ডার হয়।

setState এর উদাহরণ:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'setState Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Counter App'),
        ),
        body: CounterWidget(),
      ),
    );
  }
}

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('You have pressed the button this many times:'),
          Text(
            '$_counter',
            style: Theme.of(context).textTheme.headline4,
          ),
          ElevatedButton(
            onPressed: _incrementCounter,
            child: Text('Increment'),
          ),
        ],
      ),
    );
  }
}
  • এখানে CounterWidget এর _incrementCounter মেথড setState কল করে _counter ভ্যারিয়েবল আপডেট করে এবং UI পুনরায় রেন্ডার হয়।

২. InheritedWidget:

  • InheritedWidget হলো Flutter এর একটি লো-লেভেল স্টেট ম্যানেজমেন্ট পদ্ধতি, যা ডেটা বা স্টেটকে Widget ট্রি এর মাধ্যমে শেয়ার করতে ব্যবহৃত হয়।
  • এটি এমন একটি Widget যা Child Widget গুলোকে ডেটা প্রদান করতে পারে, এবং যদি ডেটা পরিবর্তিত হয়, তাহলে প্রয়োজনীয় Child Widget গুলো আপডেট হয়।

InheritedWidget এর উদাহরণ:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'InheritedWidget Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('InheritedWidget Demo'),
        ),
        body: CounterProvider(
          counter: 0,
          child: CounterDisplay(),
        ),
      ),
    );
  }
}

class CounterProvider extends InheritedWidget {
  final int counter;

  CounterProvider({required this.counter, required Widget child})
      : super(child: child);

  static CounterProvider? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<CounterProvider>();
  }

  @override
  bool updateShouldNotify(CounterProvider oldWidget) {
    return oldWidget.counter != counter;
  }
}

class CounterDisplay extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counter = CounterProvider.of(context)?.counter ?? 0;
    return Center(
      child: Text(
        'Counter value: $counter',
        style: Theme.of(context).textTheme.headline4,
      ),
    );
  }
}
  • এখানে CounterProvider একটি InheritedWidget, যা counter ভ্যালু Child Widget গুলোকে সরবরাহ করে।
  • CounterDisplay Widget এ CounterProvider.of(context) ব্যবহার করে ডেটা অ্যাক্সেস করা হয়েছে।

দ্রষ্টব্য: InheritedWidget সাধারণত সরাসরি ব্যবহার না করে Provider এর মত প্যাকেজ ব্যবহার করা হয়, যা আরো সহজ ও কার্যকর স্টেট ম্যানেজমেন্ট পদ্ধতি প্রদান করে।

৩. Provider:

  • Provider হলো Flutter এ একটি জনপ্রিয় স্টেট ম্যানেজমেন্ট প্যাকেজ, যা InheritedWidget এর উপর ভিত্তি করে তৈরি। এটি সহজে ডেটা শেয়ার এবং ম্যানেজ করতে সহায়তা করে।
  • Provider একটি ডেটা বা স্টেট তৈরি করে এবং Widget ট্রি এর মাধ্যমে সরবরাহ করে। এটি সহজে UI আপডেট করতে এবং ডেটা শেয়ার করতে ব্যবহৃত হয়।
  • pubspec.yaml ফাইলে provider প্যাকেজ যোগ করুন:
dependencies:
  provider: ^6.0.0

Provider এর উদাহরণ:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Provider Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Provider Demo'),
        ),
        body: CounterWidget(),
      ),
    );
  }
}

class Counter extends ChangeNotifier {
  int _value = 0;

  int get value => _value;

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

class CounterWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counter = Provider.of<Counter>(context);
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('Counter value: ${counter.value}'),
          ElevatedButton(
            onPressed: counter.increment,
            child: Text('Increment'),
          ),
        ],
      ),
    );
  }
}
  • এখানে Counter ক্লাস একটি ChangeNotifier, যা ডেটা পরিবর্তিত হলে notifyListeners() মেথড কল করে।
  • ChangeNotifierProvider ব্যবহার করে Counter এর ইনস্ট্যান্স অ্যাপের বাকি অংশে সরবরাহ করা হয়েছে।
  • Provider.of<Counter>(context) ব্যবহার করে CounterWidget এ ডেটা অ্যাক্সেস এবং আপডেট করা হয়েছে।

Provider এর সুবিধা:

  • সহজ স্টেট ম্যানেজমেন্ট: Provider স্টেট ম্যানেজমেন্টকে সহজ করে তোলে এবং কোডকে পরিষ্কার রাখে।
  • Reactive Programming: ChangeNotifier ব্যবহার করে UI আপডেট সহজে করা যায় যখন ডেটা পরিবর্তিত হয়।
  • ডেটা শেয়ার করা সহজ: Widget ট্রি এর মাধ্যমে সহজেই ডেটা শেয়ার করা যায়।

কখন কোনটি ব্যবহার করবেন?

  • setState: ছোট বা সরল Stateful Widget গুলোর ক্ষেত্রে দ্রুত স্টেট আপডেট করতে ব্যবহার করা যায়।
  • InheritedWidget: যখন স্টেট বা ডেটা একটি Widget ট্রি এর মাধ্যমে শেয়ার করতে হয় এবং আপনি কম লেভেল স্টেট ম্যানেজমেন্ট ব্যবহার করতে চান।
  • Provider: বড় এবং জটিল অ্যাপ্লিকেশনের জন্য বা যখন ডেটা অনেক জায়গায় শেয়ার করতে হয়। এটি Flutter এ স্টেট ম্যানেজমেন্টের জন্য সবচেয়ে জনপ্রিয় এবং কার্যকর সমাধান।

এই তিনটি পদ্ধতি Flutter অ্যাপের স্টেট ম্যানেজমেন্টে গুরুত্বপূর্ণ ভূমিকা পালন করে। আপনি আপনার অ্যাপের জটিলতা এবং প্রয়োজন অনুযায়ী একটি পদ্ধতি বেছে নিতে পারেন।

Content added By

Scoped Model এবং Redux দিয়ে State Management

232

Flutter এ Scoped Model এবং Redux হলো দুইটি জনপ্রিয় State Management প্যাটার্ন, যা বিশেষত মাঝারি থেকে বড় আকারের অ্যাপ্লিকেশন পরিচালনা করতে সহায়তা করে। এগুলোর মাধ্যমে অ্যাপ্লিকেশনের ডেটা বা স্টেট সঠিকভাবে শেয়ার, আপডেট, এবং মেইনটেইন করা যায়। নিচে Scoped Model এবং Redux এর মাধ্যমে State Management এর বিশদ ব্যাখ্যা এবং উদাহরণ দেয়া হলো।

Scoped Model:

Scoped Model হলো Flutter এর একটি পুরনো State Management প্যাকেজ, যা InheritedWidget এর উপরে তৈরি হয়েছে। এটি Widget ট্রির মধ্যে ডেটা শেয়ার এবং স্টেট আপডেট করতে সহজ করে তোলে।

Scoped Model এর বৈশিষ্ট্য:

  • Scoped Model ব্যবহার করে আপনি একটি গ্লোবাল স্টেট তৈরি করতে পারেন, যা অ্যাপের বিভিন্ন অংশে সহজেই অ্যাক্সেস করা যায়।
  • এটি মূলত InheritedWidget এর উপরে তৈরি হওয়ায় Widget ট্রি থেকে ডেটা খুঁজে পাওয়া সহজ।

Scoped Model সেটআপ করা:

প্রথমে scoped_model প্যাকেজ ইনস্টল করুন (pubspec.yaml এ যোগ করুন):

dependencies:
 scoped_model: ^1.0.1

Scoped Model এর উদাহরণ:

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

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

class CounterModel extends Model {
  int _counter = 0;

  int get counter => _counter;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ScopedModel<CounterModel>(
      model: CounterModel(),
      child: MaterialApp(
        home: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Scoped Model Example')),
      body: Center(
        child: ScopedModelDescendant<CounterModel>(
          builder: (context, child, model) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('Counter: ${model.counter}'),
                SizedBox(height: 16.0),
                ElevatedButton(
                  onPressed: model.increment,
                  child: Text('Increment'),
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}
  • CounterModel: একটি Model ক্লাস যা স্টেট ধারণ করে এবং পরিবর্তন ঘটালে notifyListeners কল করে।
  • ScopedModel: এটি গ্লোবাল মডেল হিসাবে কাজ করে, যা অ্যাপের অন্যান্য অংশে অ্যাক্সেস করা যায়।
  • ScopedModelDescendant: এটি মডেল থেকে ডেটা গ্রহণ করে এবং যখন মডেল পরিবর্তন হয়, তখন UI আপডেট করে।

Redux:

Redux হলো একটি জনপ্রিয় State Management প্যাটার্ন, যা বিশেষ করে বড় আকারের এবং জটিল অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। এটি অ্যাপের স্টেটকে একটি সেন্ট্রাল স্টোরে মেইনটেইন করে এবং স্টেট আপডেটের জন্য অ্যাকশন এবং রিডিউসার প্যাটার্ন ফলো করে।

Redux এর বৈশিষ্ট্য:

  • Redux একটি সেন্ট্রাল স্টোরে স্টেট মেইনটেইন করে, যা অ্যাপের যেকোনো জায়গা থেকে অ্যাক্সেস করা যায়।
  • অ্যাকশন এবং রিডিউসার প্যাটার্ন ব্যবহার করে, Redux স্টেট পরিবর্তন করে, যা অ্যাপের স্টেট আপডেট প্রক্রিয়াকে পূর্বানুমেয় এবং নির্ভরযোগ্য করে।

Redux সেটআপ করা:

প্রথমে flutter_redux প্যাকেজ ইনস্টল করুন (pubspec.yaml এ যোগ করুন):

dependencies:
  flutter_redux: ^0.8.2
  redux: ^4.0.0

Redux এর উদাহরণ:

import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux/redux.dart';

void main() {
  final store = Store<int>(counterReducer, initialState: 0);
  runApp(MyApp(store: store));
}

class MyApp extends StatelessWidget {
  final Store<int> store;

  MyApp({required this.store});

  @override
  Widget build(BuildContext context) {
    return StoreProvider<int>(
      store: store,
      child: MaterialApp(
        home: CounterScreen(),
      ),
    );
  }
}

// Action
enum Actions { Increment }

// Reducer
int counterReducer(int state, dynamic action) {
  if (action == Actions.Increment) {
    return state + 1;
  }
  return state;
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Redux Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StoreConnector<int, String>(
              converter: (store) => store.state.toString(),
              builder: (context, count) {
                return Text('Counter: $count');
              },
            ),
            SizedBox(height: 16.0),
            StoreConnector<int, VoidCallback>(
              converter: (store) {
                return () => store.dispatch(Actions.Increment);
              },
              builder: (context, callback) {
                return ElevatedButton(
                  onPressed: callback,
                  child: Text('Increment'),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}
  • Store: এটি Redux স্টেট মেইনটেইন করে। এখানে counterReducer এবং স্টেটের ইনিশিয়াল ভ্যালু পাস করা হয়েছে।
  • Action: একটি অ্যাকশন ডিফাইন করা হয়েছে Actions.Increment, যা স্টেট পরিবর্তনের জন্য ব্যবহৃত হয়।
  • Reducer: রিডিউসার একটি ফাংশন, যা বর্তমান স্টেট এবং অ্যাকশন গ্রহণ করে এবং নতুন স্টেট রিটার্ন করে।
  • StoreProvider: এটি Store কে অ্যাপের প্রতিটি অংশে অ্যাক্সেসযোগ্য করে তোলে।
  • StoreConnector: এটি Store থেকে ডেটা গ্রহণ করে এবং যখন স্টেট পরিবর্তিত হয়, তখন UI আপডেট করে।

Scoped Model এবং Redux এর তুলনা:

বৈশিষ্ট্যScoped ModelRedux
সহজতাসহজ এবং ছোট অ্যাপের জন্য সহজজটিল এবং বড় অ্যাপের জন্য উপযোগী
স্টেট শেয়ারিংপ্যারেন্ট-চাইল্ড Widgets এ সহজেই শেয়ারগ্লোবাল স্টোরে স্টেট মেইনটেইন করে
স্টেট আপডেটিংnotifyListeners() ব্যবহার করেঅ্যাকশন এবং রিডিউসারের মাধ্যমে
ডেটা স্টোরেজমডেল ও Context এর মাধ্যমে স্টেট স্টোর করেএকটি সেন্ট্রাল স্টোর মেইনটেইন করে

কখন কোনটি ব্যবহার করবেন:

  • Scoped Model: ছোট থেকে মাঝারি অ্যাপ্লিকেশনের জন্য যেখানে অ্যাপের কমপ্লেক্সিটি কম এবং স্টেট ম্যানেজমেন্ট সীমিত।
  • Redux: বড় এবং জটিল অ্যাপ্লিকেশনের জন্য যেখানে স্টেট গ্লোবালি ম্যানেজ করা প্রয়োজন এবং প্রতিটি স্টেট পরিবর্তন ট্র্যাক করতে হয়।

Flutter এ Scoped Model এবং Redux ব্যবহার করে আপনি অ্যাপ্লিকেশনের স্টেট ম্যানেজমেন্ট সিস্টেমকে শক্তিশালী করতে পারেন এবং ডাইনামিক UI এর জন্য প্রয়োজনীয় ডেটা ম্যানেজমেন্ট করতে পারেন।

Content added || updated By

Flutter এর মধ্যে Bloc প্যাটার্ন

223

BLoC (Business Logic Component) হলো একটি স্টেট ম্যানেজমেন্ট প্যাটার্ন যা Flutter এ ডেটা এবং স্টেট ম্যানেজ করার একটি কার্যকরী এবং স্কেলেবল উপায় প্রদান করে। BLoC প্যাটার্ন মূলত Reactive Programming ধারণার উপর ভিত্তি করে কাজ করে, যেখানে Streams এবং Sinks ব্যবহার করে স্টেট এবং ডেটা পরিচালনা করা হয়। এটি অ্যাপ্লিকেশনের UI এবং ব্যবসায়িক লজিককে আলাদা করে, ফলে কোড পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য হয়।

BLoC প্যাটার্নের মূল ধারণা:

  • Streams: একটি স্ট্রিম হলো ডেটার ধারাবাহিক প্রবাহ, যা অ্যাসিঙ্ক্রোনাস ভাবে ডেটা বা ইভেন্ট প্রেরণ করে।
  • Sink: একটি Sink হলো এমন একটি স্থান যেখানে আপনি নতুন ডেটা বা ইভেন্ট পাঠাতে পারেন, যা পরবর্তীতে Stream এ প্রক্রিয়া করা হয়।
  • Business Logic: BLoC প্যাটার্নে, ব্যবসায়িক লজিক (যেমন API কল, ডেটা প্রসেসিং ইত্যাদি) BLoC ক্লাসে রাখা হয়, যা UI থেকে আলাদা থাকে।

BLoC প্যাটার্নের গঠন:

BLoC প্যাটার্ন তিনটি প্রধান অংশ নিয়ে গঠিত:

  1. Event: ব্যবহারকারী বা সিস্টেম থেকে আসা ইভেন্ট যা স্টেট পরিবর্তন করতে ব্যবহার করা হয়।
  2. State: অ্যাপ্লিকেশনের বর্তমান অবস্থা বা ডেটা, যা UI তে প্রদর্শিত হয়।
  3. BLoC: BLoC ক্লাস ইভেন্ট গ্রহণ করে এবং স্টেট আপডেট করে। এটি UI এবং ডেটা প্রসেসিং এর মধ্যে একটি মিডিয়েটর হিসেবে কাজ করে।

Flutter এ BLoC প্যাকেজ সেটআপ করা:

প্রথমে flutter_bloc এবং bloc প্যাকেজ ইনস্টল করতে হবে। আপনার pubspec.yaml এ নিচের মত করে প্যাকেজ যোগ করুন:

dependencies:
  flutter_bloc: ^8.0.0
  bloc: ^8.0.0

BLoC প্যাটার্নের উদাহরণ:

নিচে একটি সাধারণ Flutter অ্যাপের উদাহরণ দেয়া হলো যেখানে কাউন্টার ইনক্রিমেন্ট করা হচ্ছে। আমরা এখানে BLoC প্যাটার্ন ব্যবহার করে State Management করেছি।

১. Event তৈরি করা:

প্রথমে আমরা ইভেন্ট ডিফাইন করবো। এখানে একটি ইভেন্ট তৈরি করা হচ্ছে যা কাউন্টার ইনক্রিমেন্ট করবে।

// counter_event.dart
abstract class CounterEvent {}

class IncrementEvent extends CounterEvent {}

২. State তৈরি করা:

এখন আমরা আমাদের অ্যাপ্লিকেশনের State তৈরি করবো। এই State কাউন্টার ভ্যালু ধারণ করবে।

// counter_state.dart
class CounterState {
  final int counter;

  CounterState(this.counter);
}

৩. BLoC ক্লাস তৈরি করা:

এখন আমরা BLoC ক্লাস তৈরি করবো, যা ইভেন্ট গ্রহণ করে এবং স্টেট আপডেট করে। এখানে IncrementEvent ইভেন্ট প্রক্রিয়া করা হবে এবং কাউন্টার আপডেট করা হবে।

// counter_bloc.dart
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(0)) {
    on<IncrementEvent>((event, emit) {
      emit(CounterState(state.counter + 1));
    });
  }
}
  • CounterBloc ক্লাসে আমরা Bloc এর কনস্ট্রাক্টর ব্যবহার করেছি। এটি CounterEvent এবং CounterState গ্রহণ করে।
  • on<IncrementEvent>: এটি ইভেন্ট লিসেন করে এবং সেই অনুযায়ী স্টেট আপডেট করে।

৪. UI তৈরি করা এবং BLoC ইন্টিগ্রেট করা:

এখন আমরা আমাদের UI তৈরি করবো এবং BLoC প্যাটার্নের সাথে ইন্টিগ্রেট করবো।

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BLoC Counter Example'),
      ),
      body: Center(
        child: BlocBuilder<CounterBloc, CounterState>(
          builder: (context, state) {
            return Text(
              'Counter: ${state.counter}',
              style: TextStyle(fontSize: 24),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read<CounterBloc>().add(IncrementEvent());
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
  • BlocProvider: এটি BLoC কে পুরো Widget ট্রিতে সরবরাহ করে, ফলে তার চাইল্ড Widgets এ BLoC অ্যাক্সেস করা যায়।
  • BlocBuilder: এটি স্টেট লিসেন করে এবং যখনই স্টেট আপডেট হয়, UI পুনরায় রেন্ডার করে।
  • context.read<CounterBloc>().add(IncrementEvent()): এটি ইভেন্ট ট্রিগার করে এবং BLoC কে বলে যে স্টেট আপডেট করতে হবে।

BLoC প্যাটার্নের সুবিধা:

  • Business Logic এবং UI আলাদা রাখা: BLoC প্যাটার্ন ব্যবহার করে আপনি আপনার ব্যবসায়িক লজিক এবং UI কে আলাদা রাখতে পারবেন, ফলে কোড পরিষ্কার এবং মেইনটেইন করা সহজ।
  • Scalable: এটি বড় এবং জটিল অ্যাপ্লিকেশন তৈরিতে সহায়ক, কারণ স্টেট এবং ডেটা এক কেন্দ্রীয় স্থানে ম্যানেজ করা হয়।
  • Reactive Programming: BLoC প্যাটার্ন স্ট্রিম এবং সিঙ্ক ব্যবহার করে ডেটা প্রসেসিং করে, যা অ্যাসিঙ্ক্রোনাস ডেটা ম্যানেজমেন্টকে সহজ করে।

BLoC প্যাটার্ন ব্যবহারের উপযোগিতা:

  • ছোট থেকে বড় অ্যাপ্লিকেশনে: ছোট অ্যাপ্লিকেশনেও BLoC প্যাটার্ন ব্যবহার করা যেতে পারে যদি আপনি আপনার অ্যাপের ভবিষ্যৎ স্কেল করার পরিকল্পনা করেন।
  • ডেটা-নির্ভর অ্যাপ্লিকেশন: যদি আপনার অ্যাপ্লিকেশন অনেক ডেটা প্রক্রিয়াকরণ এবং স্টেট পরিবর্তনের উপর নির্ভর করে, তাহলে BLoC প্যাটার্ন একটি চমৎকার পছন্দ।
  • UI রিফ্রেশ করা: যেহেতু BLoC প্যাটার্ন Streams ব্যবহার করে, তাই UI স্বয়ংক্রিয়ভাবে আপডেট হয় যখন স্টেট পরিবর্তন হয়।

Flutter এ BLoC প্যাটার্নের সংক্ষিপ্ত তুলনা:

বৈশিষ্ট্যBLoC প্যাটার্ন
আলাদা লজিক ও UIব্যবসায়িক লজিক এবং UI আলাদা রাখে
ডেটা এবং স্টেট ম্যানেজমেন্টসেন্ট্রাল জায়গায় ডেটা এবং স্টেট ম্যানেজ করে
Reactive Programmingস্ট্রিম এবং সিঙ্ক ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রক্রিয়া করে
স্কেলেবিলিটিমাঝারি থেকে বড় অ্যাপ্লিকেশনের জন্য উপযোগী

BLoC প্যাটার্ন ব্যবহার করে Flutter এ একটি স্কেলেবল এবং কার্যকরী অ্যাপ্লিকেশন তৈরি করা যায়, যেখানে ব্যবসায়িক লজিক এবং UI আলাদা রেখে কোড পুনঃব্যবহারযোগ্য এবং মেইনটেইনেবল রাখা সম্ভব।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...