Vivasoft-logo

Stream কি?

ফিউচার মুলত ইউজ হয়ে যখন আমাদের প্রয়োজন হয় সিংগেল Value অথবা Error। কিন্তু এমন যদি সিচুয়েশন আসে যেখানে কন্টিনিউয়াসলি ডাটা লাগবে তখন সেটা Future দিয়ে সবসময় পসিবল হবে না। এজন্যে ডার্টে মুলত ইউজ হয় stream। Steam একটা পাইপের মত, এক দিকে আমরা ডাটা sink করি আর অন্যদিকে আমরা সেটা stream অফ ডাটা আকারে রিসিভ করি। আমরা চাইলে পাইপের মধ্যে থাকা অবস্থায় এই ডাটা গুলা কে আমাদের ইচ্ছা মত ট্রান্সফর্ম করতে পারি StreamTransfromer দিয়ে । Steam বানাতে প্রথমে যেটা লাগে সেটা হলো async*। async* কে মুলত বলা হয় async জেনেরেটর। এটা আমাদের yield এপিয়াই প্রোভাইড করে। yield দিয়ে আমরা কোন ডাটা স্ট্রিম পাইপে সিংক করি। আমরা এই পাইপের মধ্যে শুধুমাত্র ডাটা নয় এররর সহ সিংক করতে পারি।

StreamController দিয়ে আমরা চাইলে কোন স্ট্রিম কনট্রল করতে পারি।

StreamController controller = StreamController();

// ডাটা এড করা 
controller.sink.add('Hello!');

// এরর এড করা
controller.addError('Error!');

// স্ট্রিম ক্লোজ করা 
controller.close();
 

listen মুলত ৩ টা কলব্যাক আমাদের প্রভাইড করে নিচে দেয়া হলোঃ

stream.listen(
(data) {
//ডাটা রিসিভ করলে এই কলব্যাক ডাটা প্রদান করে
},
onError: (err) {
//এরর রিসিভ করলে এই কলব্যাক এরর প্রদান করে
},
cancelOnError: false, // এটা দিয়ে আমরা এররর রিসিভ করলে লিসেন ক্যান্সেল করতে পারি
onDone: () {
// লিসেন কমপ্লিট হলে আমরা এখানে কোন কাজ করাইতে পারি।
},
);
 

উদাহরনঃ

নিচের উদাহরন টা দেখলে দেখা যায় iterateEvenStream মেথডে প্রদত্ত নাম্বারের মধ্যে লুপ চালায়ে পরি ১ সেকেন্ড পরে জোড় সংখা গুলা সেন্ড করতেছে। আর মেইন মেথডে আমরা সেটা listen করে প্রিন্ট করতেছি।

import 'dart:async';

Stream iterateEvenStream(int num) async* {
  for (int i = 1; i <= num; i++) {
    if (i%2 == 0)
    {
      await Future.delayed(const Duration(seconds: 1));
      print("Yielding from stream $i");
      yield i;
    }
  }
}



main() async {
  var stream = iterateEvenStream(6);
  stream.listen((value) {
    print("Received on main $value\n");
  });
}
 

আউটপুটঃ

Yielding from stream 2
Received on main 2
Yielding from stream 4
Received on main 4
Yielding from stream 6
Received on main 6