বিড়ম্বনা: ফায়ারবেস আরটিডিবি দিয়ে সিআরইউডি কীভাবে করবেন

ভূমিকা

ফ্লিটারের আগের পোস্টে ফায়ারবেস দিয়ে কীভাবে লগ ইন করবেন: আমরা কীভাবে ব্যবহারকারীর লগইন বা ফায়ারবেস প্রমাণীকরণের মাধ্যমে লগইন স্ক্রিন প্রয়োগ করতে পারি সে সম্পর্কে কথা বললাম। একই প্রকল্পের সাহায্যে আমরা এই পোস্টে সিআরইউডি চালু করব বা ফায়ারবেস আরটিডিবি বা রিয়েল-টাইম ডাটাবেসের সাহায্যে ক্রিয়াকলাপগুলি তৈরি করব, পড়ব, আপডেট করব এবং মুছব।

শুরু করা

এই প্রকল্পের জন্য আপনাকে ফায়ারবেসের সাথে আপনার প্রকল্পটি নিবন্ধিত করতে হবে এবং আপনার প্রকল্পে ডাউনলোড করা কনফিগারেশন ফাইলটি অন্তর্ভুক্ত করতে হবে। আপনি উপরের আগের পোস্টে উল্লিখিত পদক্ষেপগুলি পেতে পারেন। এই পদক্ষেপটি কেবলমাত্র প্রয়োজনীয় যদি আপনি নিজের ফায়ারবেস ডাটাবেস সেট আপ করতে পছন্দ করেন, অন্যথায় আপনি গিথুব প্রকল্পে আমি যে কনফিগারেশন ফাইলটি অন্তর্ভুক্ত করেছি তা দিয়ে আপনি খনি ব্যবহার করতে পারেন। এই পোস্টের শেষে প্রকল্পের লিঙ্কটি সন্ধান করুন।

স্টেপ 1: মডেল ক্লাস তৈরি করুন

ব্যবহারকারী সফলভাবে তাদের অ্যাকাউন্টে লগ ইন করার পরে, আমরা স্বাগত বার্তাটি দেখতে সক্ষম হয়েছি। এটি হোম_পেজ.ডার্টে প্রদর্শিত হয়। আমাদের করণীয়ের অ্যাপ্লিকেশনটিকে সহজ রাখতে, আমরা কেবলমাত্র কার্যটির নামটি সংরক্ষণ করছি এবং ব্যবহারকারীর এটিকে কাজটি সম্পন্ন বা না করা হিসাবে চিহ্নিত করার অনুমতি দিচ্ছি। প্রতিটি আইটেম সম্পন্ন হওয়ার তথ্য সংরক্ষণ করার জন্য, আমাদের একটি মডেল ক্লাস প্রয়োজন। কোনও আইটেমটি সম্পন্ন করার জন্য একটি মডেল ক্লাস এর মতো দেখাচ্ছে:

/ মডেলস / টোডো.ডার্ট

ক্লাস টডো {স্ট্রিং কী; স্ট্রিং বিষয়; বুল সমাপ্ত; স্ট্রিং ইউজারআইডি; টোডো (this.subject, this.userId, this.completed); Todo.fromSnapshot (DataSnapshot-Snapshot): key = snapshot.key, userId = snapshot.value ["userId"], সাবজেক্ট = snapshot.value ["সাবজেক্ট"], সমাপ্ত = স্ন্যাপশট.মূল্য ["সম্পন্ন"]; toJson () {রিটার্ন user "ইউজারআইডি": ইউজারআইডি, "সাবজেক্ট": সাবজেক্ট, "সম্পন্ন": সম্পন্ন,}; }}

প্রতিটি কাজের উপাদানটি অনন্য এবং এর নিজস্ব কী রয়েছে। প্রতিটি আইটেমের একটি নাম বা বিষয়, একটি পতাকা যা সমাপ্তি বা সমাপ্তি ট্র্যাক করতে ব্যবহৃত হয় এবং এমন একটি ব্যবহারকারী ID যা নির্দেশ করে যে এই আইটেমটি কে তৈরি করেছে created একটি নতুন টাস্ক তৈরি করতে, কী ব্যতীত সমস্ত প্যারামিটারগুলি টোডো () কনস্ট্রাক্টরের কাছে দিতে হবে। নতুন কার্যগুলি যুক্ত করা হলে কীটি স্বয়ংক্রিয়ভাবে আরটিডিবি দ্বারা উত্পন্ন এবং সংরক্ষণ করা হবে।

ফায়ারবেস আরটিডিবি থেকে ডেটা পুনরুদ্ধার করা হলে, এটি জসন ফর্ম্যাটে থাকে। অতএব, আমাদের কাছে টোডো.ফ্রমস্ন্যাপশট (ডাটাস্ন্যাপশট-স্ন্যাপশট) রয়েছে যা আমরা জসন ফর্ম্যাট থেকে টোডো ফর্ম্যাটে ডেটা ম্যাপ করতে পারি। ToJson () বিপরীতে কাজ করে, যথা আমরা ফায়ারবেস আরটিডিবিতে আপলোড করার আগে তথ্যটিকে জসন ফর্ম্যাটে ম্যাপ করার জন্য।

স্টেপ 2: কোয়েরি আরম্ভ করুন

আমাদের হোম_পেজ.ডার্টনে ফিরে আমাদের তালিকা রয়েছে _todoList = নতুন তালিকা () কার্যগুলির একটি তালিকা তৈরি করে। ফায়ারবেস থেকে কার্যগুলির একটি তালিকা এলে আমরা তাদের স্থানীয় তালিকা ভেরিয়েবলগুলিতে সঞ্চয় করি।

আমরা অবশেষে ফায়ারবেসড্যাটব্যাক্স _ডেটবেস = ফায়ারব্যাড ডাটাবেস ইন্ডিস্ট্যান্স ব্যবহার করি; ফায়ারবেস দৃষ্টান্ত অ্যাক্সেস পেতে। তারপরে আমরা এই উদাহরণটি সহ একটি কোয়েরি তৈরি করি:

ক্যোয়ারী_টডোকিউয়ারি = _ডাটাবেস। রেফারঞ্জ () .চাইল্ড ("টুডো") .অর্ডারবাইচাইল্ড ("ইউজারআইডি") .একুয়ালটো (উইজেট.ইউজারআইডি);

এই ক্যোয়ারিতে, আমরা পথ / টোডোর অধীনে থাকা সমস্ত ডেটার রেফারেন্স পেতে ফায়ারবেস ডাটাবেস উদাহরণটি ব্যবহার করছি। আপনার যদি টোডোতে আরও একটি স্তর থাকে তবে আপনার ক্যোয়ারির নাম _ড্যাটাবেস। রেফারেন্স ()। শিশু ("টুডো")। শিশু ("অন্য স্তর")। অর্ডারবাইচাইল্ড ("এক্সএক্সএক্সএক্সএক্স") এবং .equalTo ("এক্সএক্সএক্সএক্সএক্স") উভয়ই ফায়ারবেসকে বলেছে যে আমি আপনাকে দেওয়া প্রতিটি কাজের ইউজার আইডি হ'ল কাজগুলির একটি তালিকা চাই। বোধ হয়?

আরটিডিবিতে এটি দেখতে এটির মতো:

স্টেপ 3: শ্রোতা সেট আপ করুন

সবেমাত্র তৈরি করা ক্যোয়ারির সাথে আমরা এতে দুটি ধরণের স্ট্রিম সাবস্ক্রিপশন যুক্ত করছি। একটি হ'ল চিল্ডএডেড এবং অন্যটি হ'ল চিলড চেঞ্জড। অনকিল্ডএডেড.ইলস্টেন () ফায়ারবেসে নতুন কাজ যুক্ত হওয়ার জন্য অপেক্ষা করে এবং একটি ইভেন্ট এবং একটি কলব্যাক ফাংশন গ্রহণ করে, এই ক্ষেত্রে _অন্ট্রিএডড করুন। এটি একইভাবে onChildChanged.listen () এ প্রযোজ্য, যা ফায়ারবেসে ডেটা পরিবর্তনের জন্য অপেক্ষা করে, উদাঃ বি সম্পন্ন হিসাবে চিহ্নিতকরণ।

_onTodoAddedSubscript = _todoQuery.onChildAdded.listen (_onEntryAdded); _অনটোডো চেঞ্জড সাবস্ক্রিপশন = _ টোডোকিয়ারি.অনচিলড চ্যাঞ্জড.লিসটেন (_অন্ট্রিচেনজড);

_অ্যান্ট্রিএডডের কাজ কী? এটি ইভেন্টের স্ন্যাপশটটি ক্যাপচার করে এবং জেএসএন থেকে টডোতে মডেল ফর্ম্যাটটিকে রূপান্তরিত করে এবং এটিকে টডোসের তালিকায় যুক্ত করে।

_onEntryAdded (ইভেন্ট ইভেন্ট) {setState (() {_todoList.add (Todo.fromSnapshot (ইভেন্ট.স্ন্যাপশট));}); }

_OnEntryChanged ফাংশন ইভেন্টের স্ন্যাপশট থেকে কীটি পায় এবং টাস্ক তালিকা থেকে সূচকটি পায়। এরপরে তালিকার সূচক থেকে ইভেন্ট স্ন্যাপশট থেকে এই নির্দিষ্ট কাজটি আপডেট করে।

_onEntryChanged (ইভেন্ট ইভেন্ট) old var OldEntry = _todoList.singleWhere ((এন্ট্রি) {রিটার্ন এন্ট্রি.কি == ইভেন্ট.স্ন্যাপশট.কি;}); সেটস্টেট (() {_todoList [_todoList.indexOf (oldEntry)] = Todo.fromSnapshot (ইভেন্ট.স্ন্যাপশট);}); }

স্ট্রিমসবসক্রিপশন সাবস্ক্রিপশনটি সঠিকভাবে বাতিল করতে, আমরা কেবল নিষ্পত্তি () পদ্ধতির মধ্যে .cancel () ব্যবহার করি

@ ওভাররাইড অকার্যকর নিষ্পত্তি () {_অনটোডোএডেডসবস্ক্রিপশন.ক্যান্সেল (); _অনটোডো চেঞ্জড সাবস্ক্রিপশন.ক্যান্সেল (); সুপার.ডিসপোজ (); }

স্টেপ 4: এই লিস্টভিউটি তৈরি করুন

আকার পরিবর্তন করে আইটেমগুলির একটি তালিকা পুনরুক্ত করা এবং তালিকাতে সেগুলিকে প্রদর্শন করা দরকার হলে আমি তালিকাভিউটি ব্যবহার করতে চাই। এই ক্ষেত্রে আমরা _ টোটোলিস্টে প্রতিটি টাস্ক আইটেম নিয়ে যাব। লিস্টভিউ আইটেমকাউন্ট নেয়, যা কেবল কার্য তালিকার আকার; এইচ ._ডোডলিস্ট.কাউন্ট। লিস্টভিউ আইটেমবিল্ডারও গ্রহণ করে, এমন একটি অংশ যা একক টাস্ক আইটেমটি প্রদর্শন করতে একক টাইল তৈরি করে। আমরা একটি একক টাস্ক আইটেমটি প্রদর্শন করতে তালিকার উইজেটটি ব্যবহার করতে যাচ্ছি। লিস্টটাইল কিছু প্যারামিটার গ্রহণ করে যেমন দুটি আলাদা প্রসঙ্গ এবং আকারে পাঠ্য প্রদর্শন করার জন্য তালিকার ডানদিকে আইকন বা অন্যান্য উইজেট স্থাপনের জন্য অনুসরণ, শিরোনাম এবং সাবটাইটেল।

প্রতিটি লিস্টটাইলে টাস্কটি করা না হলে একটি ধূসর চেক চিহ্ন এবং টাস্কটি সম্পন্ন হলে একটি সবুজ চেক চিহ্ন রয়েছে। আমরা এর জন্য টার্নারি অপারেটরটি ব্যবহার করতে পারি। , যদি একটি অন্য বিবৃতি অনুরূপ।

এটি ব্যবহার করতে, আমরা কিছু শর্তের মধ্যে একটি বুলিয়ান চেক করি (এই ক্ষেত্রে ফায়ারবেসে কোনও উপাদানটির জন্য "সমাপ্ত" পতাকাটি পরীক্ষা করা হয়) এবং প্রস্থান করার সাথে?

(_টোডোলিস্ট [সূচক]। কমপ্লিট)? [আপনার হয়ে গেলে কিছু করুন]: [আপনার কাজ শেষ না হলে কিছু করুন]

সুতরাং আমাদের লিস্টটাইলটি দেখতে এমন দেখাচ্ছে:

চাইল্ড: লিস্টটাইল (শিরোনাম: পাঠ্য (বিষয়, শৈলী: পাঠ্য স্টাইল (ফন্টের আকার: 20.0),)), শেষে: আইকনবাটন (আইকন: (_ টোটোলিস্ট [সূচক]। সমাপ্ত)) সিম্বল (আইকনস.ডোন_আউটলাইন, রঙ: রং : 20.0,): আইকন (আইকনস.ডোন, রঙ: রঙস.grey, আকার: 20.0), অনপ্রেসড: () up _updateTodo (_ টোডোলিস্ট [সূচক]);}),)

এবং সামগ্রিক তালিকাভিউ:

উইজেট _শোডোলিস্ট () {if (_todoList.length> 0) {ফিরিয়ে দিন তালিকাভিউ.বিল্ডার (সঙ্কুচিতভাবে মোড়ানো: সত্য, আইটেমউন্ট: _টডোলিস্ট.লেমেন্থ, আইটেমবিল্ডার: (বিল্ডকন্টেক্সট প্রসঙ্গ, ইনটেক্স ইনডেক্স) ring স্ট্রিং টুডআইডি = _ টোটোলিস্ট [সূচক]। ; স্ট্রিং সাবজেক্ট = _ টোডোলিস্ট [ইনডেক্স]। সাবজেক্ট; বুল সম্পন্ন = _টোডোলিস্ট [ইনডেক্স]। কমপ্লিট; স্ট্রিং ইউজারআইডি = _ টোডোলিস্ট [ইনডেক্স]। রিটার্ন অনুমোদিত নয় (কী: কী (টোডআইড), ব্যাকগ্রাউন্ড: ধারক (রঙ: কালারস.রেড ), অনডিজমড: (দিকনির্দেশ) async {_deleteTodo (todoId, সূচি);}, শিশু: তালিকার টাইল (শিরোনাম: পাঠ্য (বিষয়, শৈলী: পাঠ্য স্টাইল (ফন্টের আকার: 20.0),)), শেষে: আইকনবাটন (আইকন: (সম্পূর্ণ))? আইকন (আইকনস.ডোন_আউটলাইন, রঙ: কালারসগ্রিন, আকার: 20.0,): আইকন (আইকনস.ডোন, রঙ: Colors.grey, আকার: 20.0), অনপ্রেসড: () up _updateTodo (_ টোডোলিস্ট [সূচক]); }),),); }); } অন্য {কেন্দ্র ফিরে (শিশু: পাঠ্য ("স্বাগতম।" আপনার তালিকাটি ফাঁকা আছে ", পাঠ্যলাইন: পাঠ্যলাইন.সেন্টার, শৈলী: টেক্সট স্টাইল (ফন্টসাইজ: 30.0),)); }}

নোট করুন যে তালিকার টাইলটি অন্য একটি উইজেট কল বর্জনযোগ্য with এটি এমন একটি উইজেট যা ব্যবহারকারীর মুছে ফেলার ক্রিয়াকলাপটি নকল করতে পুরো লিস্টটাইলটিকে সোয়াইপ করতে দেয়।

স্টেপ 5: অসাধারণ এফএবি

সৃজনশীল পদ্ধতিতে হোম_পেজ.ডার্টে, যা একটি ভাস্কর্যটি ফেরত দেয়, আমরা শরীরের নীচে একটি এফএবি বা ভাসমান ক্রিয়া বোতাম তৈরি করি। এই বোতামটির উদ্দেশ্যটি হল ব্যবহারকারীকে তালিকায় নতুন কার্য যুক্ত করতে দেওয়া। এফএএবি একটি সতর্কতা সংলাপ প্রদর্শন করে যা ব্যবহারকারীর জন্য নতুন টাস্কের নাম প্রবেশের জন্য একটি পাঠ্য বাক্স ধারণ করে।

ভাসমান অ্যাকশনবটন: ভাসমান অ্যাকশনবটন (অনপ্রেসড: () {_ শোডায়ালগ (প্রসঙ্গ);}, টুলটিপ: 'বর্ধন', প্রকার: আইকন (আইকনস.এডিডি),)

সতর্কবার্তা সংলাপটি প্রদর্শিত হওয়ার জন্য, আপনি কেবল একটি সতর্কতা ডায়ালগটি ফিরিয়ে দিতে পারবেন না এবং এটি উপস্থিত হওয়ার প্রত্যাশা করতে পারবেন না। পরিবর্তে আমাদের এই বিল্ডারে ওয়েট শো ডায়ালগ () ব্যবহার এবং সতর্কতা ডায়ালগ ব্যবহার করতে হবে return সতর্কতা ডায়ালগটিতে একটি পাঠ্য ক্ষেত্র রয়েছে, যার মান সংরক্ষণ এবং বাতিল করার জন্য 2 টি ফ্ল্যাটব্যাটনের সাহায্যে একটি পাঠ্য সম্পাদনা নিয়ন্ত্রণকারী দ্বারা সংরক্ষণ করা হয়। সেভ বোতামটি নতুন টাস্ক আইটেমটির নাম পেয়েছে এবং এটি ফায়ারবেসে আপলোড করার আগে একটি নতুন টাস্ক ইভেন্ট তৈরি করে।

_ শোডায়ালগ (বিল্ডকন্টেক্সট প্রসঙ্গ) async {_textEditingController.cियर (); শো ডায়ালগের জন্য অপেক্ষা করুন (প্রসঙ্গ: প্রসঙ্গ, জেনারেটর: (বিল্ডকন্টেক্সট-প্রসঙ্গ)) সতর্কতা ডায়ালগ (সামগ্রী: নতুন লাইন (শিশু: [নতুন প্রসারিত (শিশু: নতুন টেক্সটফিল্ড (নিয়ামক: _textEditingController, অটোফোকাস: সত্য, সাজসজ্জা: নতুন ইনপুটডেকোরেশন (লেবেল পাঠ: 'নতুন টুডো যোগ করুন',),))))),): ক্রিয়া: [নতুন ফ্ল্যাটবটন (শিশু: কনট টেক্সট ('বাতিল')), অনপ্রেসড: () {ন্যাভিগেটর.পপ (প্রসঙ্গ);}), নতুন ফ্ল্যাটবটন (শিশু: কনট টেক্সট ('সংরক্ষণ করুন'), অনপ্রেসড: () .text.toString ()); নেভিগেটর.পপ (প্রসঙ্গ);})],); }); }

স্টেপ 5: আসুন CRUD করা যাক

- তৈরি করুন

একটি নতুন টাস্ক উপাদান তৈরি করতে, আমরা যখন ফ্লোটিং অ্যাকশনবটনে ট্যাপ করি তখন আমরা সতর্কতা ডায়ালগের পাঠ্য ক্ষেত্রে ব্যবহারকারীর নাম এন্ট্রি গ্রহণ করি। আমরা নামের ইনপুট সহ একটি নতুন টাস্ক অবজেক্ট ইনস্ট্যান্ট করি। শেষ পর্যন্ত আমরা _ড্যাটাবেস.রিফারেন্স () দিয়ে লোড করি। শিশু ("টুডো")। পুশ ()। ফায়ারবেসে সেট করুন (todo.toJson ())।

_addNewTodo (স্ট্রিং টোডো আইটেম) {if (todoItem.length> 0) {টডো টোডো = নতুন টডো (todoItem.toString (), উইজেট.ইউসারআইডি, মিথ্যা); _ডাটাবেস.রিফারেন্স ()। শিশু ("টুডো")। ধাক্কা ()। সেট (todo.toJson ()); }}

E পড়ুন

পড়ার জন্য, উপরে উল্লিখিত ছিল যে আপনার নীচে নীচে পড়া একটি ক্যোয়ারী তৈরি করতে হবে:

_todoQuery = _ তথ্যসূত্র

দুটি শ্রোতা (onChilAdded এবং onChildChanged) ক্যোয়ারির সাথে সংযুক্ত আছে, যা ইভেন্টের স্ন্যাপশটের সাথে সম্পর্কিত কলব্যাক পদ্ধতিগুলিকে ট্রিগার করে। ইভেন্ট স্ন্যাপশট থেকে, আমরা কেবল এটিকে একটি টোডো শ্রেণিতে রূপান্তর করি এবং এটিকে তালিকায় যুক্ত করি

_onEntryAdded (ইভেন্ট ইভেন্ট) {setState (() {_todoList.add (Todo.fromSnapshot (ইভেন্ট.স্ন্যাপশট));}); }
_onEntryChanged (ইভেন্ট ইভেন্ট) old var OldEntry = _todoList.singleWhere ((এন্ট্রি) {রিটার্ন এন্ট্রি.কি == ইভেন্ট.স্ন্যাপশট.কি;}); সেটস্টেট (() {_todoList [_todoList.indexOf (oldEntry)] = Todo.fromSnapshot (ইভেন্ট.স্ন্যাপশট);}); }

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

Rules / * সুরক্ষা বিধি সম্পর্কিত আরও তথ্য https://firebase.google.com / ডকস / ডেটাবেস / সুরক্ষায় পাওয়া যায়। * / "বিধি": {"মেক": {".আইডেক্সঅন": "ইউজারআইডি",}, ".ড্রেড": সত্য, ".লিখন": সত্য}

- আপডেট

ব্যবহারকারী যে কোনও আইটেমকে সম্পন্ন হিসাবে চিহ্নিত করতে বা এই পদক্ষেপটি পূর্বাবস্থায় ফিরিয়ে আনতে পারে। আপনি প্রতিটি টডলিস্টলাইটের ডানদিকে চেক চিহ্ন আইকনটি ট্যাপ করতে পারেন। আপডেটের জন্য আমাদের টোড.কি দরকার কারণ আমাদের এই পাথের সামগ্রীটি আপডেট করার জন্য পাথ / টুডো / টোডো-ইউনিক-কীটি অ্যাক্সেস করতে হবে। পদ্ধতিটি সেই অর্থে তৈরির অনুরূপ যা এটি .set () ব্যবহার করে তবে পার্থক্যটি হল পথটিতে .child (todo.key) যুক্ত করা।

_updateTodo (টোডো টুডো) ​​{// স্যুইচিং সম্পূর্ণ todo.completed =! todo.completed; যদি (টুডো! = নাল) {_ডাটাবেস.রেফারেন্স ()। শিশু ("টুডো")। চাইল্ড (todo.key) .set (todo.toJson ()); }}

-ডিলিট

ফায়ারবেস থেকে আইটেমগুলি মুছে ফেলা সহজ। আপডেটের মতো, আমাদের সঠিক todo.key পাওয়া দরকার, তবে আমরা .remove () পদ্ধতিটি ব্যবহার করতে যাচ্ছি।

নোট করুন, যুক্ত বা পরিবর্তিত আইটেমগুলির জন্য শ্রোতার বিপরীতে, আইটেমগুলি সরিয়ে দেওয়ার জন্য কোনও শ্রোতা নেই। অতএব, এই 2-শ্রোতার পদ্ধতিতে আগুন লাগার এবং ডাটাবেসের সর্বশেষ স্ন্যাপশট পাওয়ার কোনও উপায় নেই। এই কারণে, ফায়ারবেস থেকে মুছে ফেলা সফল হলে আমাদের কেবলমাত্র স্থানীয়_ডটললিস্ট ভেরিয়েবল থেকে উপাদানটি ম্যানুয়ালি মুছে ফেলতে হবে।
_ডিলেটটোডো (স্ট্রিং টুডোআইডি, ইনড ইনডেক্স) {_ডাটাবেস.রেফারেন্স ()। শিশু ("টুডো")। চাইল্ড (টুডআইড) .মরাও ()। তারপরে ((_) {মুদ্রণ ("মুছে ফেলুন $ টুডো সফলভাবে"); সেটস্টেট (() {_todoList.removeAt (সূচক);});}); }

ডেমো

এটি অ্যাপ্লিকেশনটির মতো দেখাচ্ছে

শেষ অ্যাপের ডেমো

গিথুব

উত্স কোড উপলব্ধ:

https://github.com/tattwei46/flutter_login_demo

স্বীকৃতি

এই পোস্টটি পড়তে সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। আমি আশা করি এটি আপনার ঝাঁকুনির সাথে দুর্দান্ত যাত্রায় আপনাকে সহায়তা করবে। যদি আপনি এটি সহায়ক মনে করেন তবে দয়া করে আমাকে এই জাতীয় নিবন্ধ লিখতে উত্সাহিত করুন