KoderKoder.ai
প্রাইসিংএন্টারপ্রাইজএডুকেশনবিনিয়োগকারীদের জন্য
লগ ইনশুরু করুন

প্রোডাক্ট

প্রাইসিংএন্টারপ্রাইজবিনিয়োগকারীদের জন্য

রিসোর্স

আমাদের সাথে যোগাযোগ করুনসহায়তাএডুকেশনব্লগ

লিগ্যাল

প্রাইভেসি পলিসিটার্মস অফ ইউজসিকিউরিটিঅ্যাকসেপ্টেবল ইউজ পলিসিঅ্যাবিউজ রিপোর্ট করুন

সোশ্যাল

LinkedInTwitter
Koder.ai
ভাষা

© 2026 Koder.ai. সর্বস্বত্ব সংরক্ষিত।

হোম›ব্লগ›Flutter vibe coding ফাঁক: মসৃণ রিলিজের জন্য 12টি সমাধান
১২ ডিসে, ২০২৫·8 মিনিট

Flutter vibe coding ফাঁক: মসৃণ রিলিজের জন্য 12টি সমাধান

Flutter ভাইব কোডিংয়ে শেষ মুহূর্তের সারপ্রাইজ এড়াতে নেভিগেশন, API, ফর্ম, পারমিশন ও রিলিজ বিল্ড সমস্যাগুলির ব্যাখ্যা ও সমাধান।

কেন চ্যাট-ভিত্তিক বিল্ডে Flutter প্রকল্পগুলো শেষ মুহূর্তে ভেঙে যায়

Vibe coding আপনাকে দ্রুত একটি ক্লিকযোগ্য Flutter ডেমো পর্যন্ত নিয়ে যেতে পারে। Koder.ai-এর মতো একটি টুল সহজ চ্যাট থেকে স্ক্রিন, ফ্লো, এমনকি ব্যাকএন্ড ওয়ারিংও জেনারেট করতে পারে। তবে এটি যা বদলাতে পারে না তা হলো মোবাইল অ্যাপগুলোর নেভিগেশন, স্টেট, পারমিশন এবং রিলিজ বিল্ড সম্পর্কে কঠোর নিয়ম। ফোনগুলো এখনও সত্যি হার্ডওয়্যার, OS নিয়ম, এবং স্টোর রিকোয়্যারমেন্টে চলে।

অনেক সমস্যা শেষ পর্যন্ত দেখা দেয় কারণ আপনি সেগুলো শুধু হ্যাপি-পাথেই দেখেন। সিমুলেটর একটি কম-ক্ষমতার Android ডিভাইসের মতো নাও হতে পারে। ডিবাগ বিল্ড টাইমিং ইস্যু লুকিয়ে রাখতে পারে। এবং একটি ফিচার একটি স্ক্রিনে ঠিক থাকলেও সেটা নেভিগেট করে ফিরে গেলে, নেটওয়ার্ক চলে গেলে বা ডিভাইস রোটেট করলে ভেঙে পড়তে পারে।

শেষ মুহূর্তের সারপ্রাইজগুলো সাধারণত কয়েকটি বালতিতে পড়ে, এবং প্রতিটিতে একটি খুব চেনা লক্ষণ থাকে:

  • নেভিগেশন ও স্টেট সমস্যা: স্ক্রিন রিসেট হয়, ব্যাক করলে অ্যাপ বের হয়ে যায়, ফিরে গিয়ে ডেটা হারায়
  • API অসামঞ্জস্য: একটি স্ক্রিনে ভিন্ন বেস URL, হেডার, অথবা টোকেন ব্যবহৃত হয়, তাই "এখানে কাজ করে" কিন্তু অন্যত্র ব্যর্থ হয়
  • ফর্ম ভ্যালিদেশন ফাঁক: সাইনআপে খারাপ ইনপুট নেওয়া হয়, পেমেন্ট নীরবভাবে ব্যর্থ হয়, এরর ব্যবহারকারী প্রত্যাশা অনুযায়ী দেখানো হয় না
  • পারমিশন ফাঁদ: ক্যামেরা বা নোটিফিকেশন এক OS-এ কাজ করে, অন্যটিতে না, অথবা অ্যাপ রিজেক্ট হয় ব্যবহারকারীর টেক্সট অনুপস্থিতির কারণে
  • রিলিজ-এ শুধু দেখা যায় এমন পরিবর্তন: রিলিজে ক্র্যাশ, অনুপস্থিত অ্যাসেট, ভাঙা ডিপ লিঙ্ক, ধীর স্টার্টআপ

একটি দ্রুত মানসিক মডেল সাহায্য করে। একটি ডেমো হলো “এটি একবার চলে।” একটি শিপেবল অ্যাপ হলো “এটি বিশৃঙ্খল বাস্তব জীবনে কাজ চালিয়ে যায়।” সাধারণত “ডোন” মানে এগুলো সত্যি:

  • এটি কমপক্ষে একটি Android ফোন ও একটি iPhone-এ কাজ করে, শুধুমাত্র এমুলেটরে নয়
  • ধীর বা অনলাইন ছাড়া নেটওয়ার্কে স্পষ্ট বার্তা এবং রিট্রাই রয়েছে
  • যখন অ্যাপ ব্যাকগ্রাউন্ড হয়ে ফিরে আসে তখন স্টেট সঠিক থাকে
  • পারমিশন ও OS প্রম্পটগুলি অ্যাপের কাজের সাথে মিলে
  • রিলিজ বিল্ড বাস্তবে কী-গু, সাইনিং, এবং রিয়েল লগিং দিয়ে সফলভাবে চলে

একটি সহজ সেটআপ যা বেশিরভাগ শেষ মুহূর্তের সারপ্রাইজ প্রতিরোধ করে (ধাপে ধাপে)

অনেক “কালকে কাজ করছিল” মুহূর্ত ঘটে কারণ প্রোজেক্টে কোনো শেয়ার্ড নিয়ম নেই। Vibe coding দিয়ে আপনি দ্রুত অনেক জেনারেট করতে পারেন, কিন্তু এখনও একটি ছোট ফ্রেম দরকার যাতে অংশগুলো একত্রে ফিট করে। এই সেটআপ গতি বজায় রেখে শেষ মুহূর্বি ভাঙন কমায়।

৩০-মিনিটের ফাউন্ডেশন

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

  2. কয়েকটি কনভেনশন প্রথমেই লক করে রাখুন। ফোল্ডার নাম, ফাইল নামকরণ, এবং এরর কীভাবে দেখানো হবে সে বিষয়ে একমত হন। অ্যাসিঙ্ক লোডিংয়ের জন্য একটি প্যাটার্ন নির্ধারণ করুন (loading, success, error) যাতে স্ক্রিনগুলো ধারাবাহিকভাবে আচরণ করে।

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

  4. এখনই লগিং ও ক্র্যাশ রিপোর্টিং প্লেসহোল্ডার যোগ করুন। যদিও আপনি এখনই চালু না করলেও, একটি লগিং এন্ট্রি পয়েন্ট তৈরি করুন (যাতে পরে প্রোভাইডার বদলানো যায়) এবং একটি জায়গা যেখানে অনক্যাচড এরর রেকর্ড হবে। বিটা ব্যবহারকারী ক্র্যাশ রিপোর্ট করলে, একটি ট্রেইল দরকার হবে।

  5. একটি জীবন্ত “রেডি টু শিপ” নোট রাখুন। একটি ছোট পৃষ্ঠা যা প্রতিটি রিলিজের আগে রিভিউ করলে শেষ মুহূর্তের প্যানিক রোধ হয়।

যদি আপনি Koder.ai দিয়ে বিল্ড করেন, প্রথমে এটি দিয়ে ইনিশিয়াল ফোল্ডার স্ট্রাকচার, একটি শেয়ার্ড এরর মডেল, এবং একটি একক লগিং র‍্যাপার জেনারেট করতে বলুন। তারপর সেই ফ্রেমের ভেতরে ফিচারগুলো জেনারেট করুন যাতে প্রতিটি স্ক্রিন নিজস্ব পদ্ধতি আবিষ্কার না করে।

রেডি টু শিপ-এর সংজ্ঞা (সংক্ষিপ্ত রাখুন)

একটি অনুসরণযোগ্য চেকলিস্ট ব্যবহার করুন:

  • অ্যাপ শুরু হয় এবং ব্যর্থ API কল থেকে রিকভার করে এমনভাবে ফ্রিজ করে না
  • কোর ফ্লো খারাপ ইনপুটে কাজ করে (খালি ফিল্ড, ভুল ইমেল, ধীর নেটওয়ার্ক)
  • পারমিশনগুলো প্রয়োজন অনুসারে শুধুমাত্র তখন অনুরোধ করা হয় এবং অস্বীকার হলে হ্যান্ডেল করা হয়
  • রিলিজ মোড বিল্ড সফল (শুধু ডিবাগ নয়) এবং জরুরি স্ক্রিনগুলো স্মোক-টেস্ট করা হয়েছে
  • একজন ব্যক্তি বাস্তব ডিভাইসে ইনস্টল করে নির্দেশনা ছাড়া ব্যবহার করতে পারে

এটি বিরোধিতা নয়। এটি একটি ছোট চুক্তি যা চ্যাট-জেনারেটেড কোডকে “ওয়ান-অফ স্ক্রিন” আচরণে ড্রিফট করা থেকে রোধ করে।

নেভিগেশন এবং স্টেটের ফাঁক যা রিয়েল ডিভাইসে দেখা যায়

নেভিগেশন বাগগুলো প্রায়শই হ্যাপি-পাথ ডেমোতে লুকিয়ে থাকে। একটি রিয়েল ডিভাইস ব্যাক জেসচার, রোটেশন, অ্যাপ রিসিউম, এবং ধীর নেটওয়ার্ক যুক্ত করলে হঠাৎ করে আপনি “setState() called after dispose()” বা “Looking up a deactivated widget’s ancestor is unsafe.” মতো এরর পাবেন। এই সমস্যাগুলো চ্যাট-বিল্ট ফ্লোতে সাধারণ কারণ অ্যাপটি একক পরিকল্পনা হিসেবে নয়, স্ক্রিন-বাই-স্ক্রিন বাড়ে।

ফোনে আপনি যে বাগগুলো অনুভব করবেন

একটি ক্লাসিক সমস্যা হলো এমন কনটেক্সট দিয়ে নেভিগেট করা যা আর বৈধ নেই। এটি ঘটে যখন আপনি Navigator.of(context) কল করেন একটি অ্যাসিঙ্ক রিকোয়েস্টের পরে, কিন্তু ব্যবহারকারী ইতিমধ্যেই স্ক্রিন ছেড়ে দিয়েছে, বা রোটেশনের পরে OS উইজেটটিকে পুনর্নির্মাণ করেছে।

আরও একটি সমস্যা হলো “এক স্ক্রিনে কাজ করে” ব্যাক আচরণ। Android-এর ব্যাক বাটন, iOS ব্যাক সোয়াইপ, এবং সিস্টেম ব্যাক জেসচার একভাবে কাজ নাও করতে পারে, বিশেষত যখন আপনি ডায়ালগ, নেস্টেড নেভিগেটর (ট্যাব), এবং কাস্টম রুট ট্রানজিশন মিশান।

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

শেষে সারপ্রাইজ প্রতিরোধের ফিক্স

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

অ্যাসিঙ্ক নেভিগেশন নিরাপদ করুন। এমন কোনও await কলের পরে যা স্ক্রিনের চেয়ে বেশি সময় নিতে পারে (লগইন, পেমেন্ট, আপলোড), স্টেট আপডেট বা নেভিগেশন করার আগে নিশ্চিত করুন স্ক্রিনটি এখনও জীবিত আছে।

কিছু দ্রুত কাজ দেয় এমন গার্ডরেইল:

  • await-এর পরে if (!context.mounted) return; ব্যবহার করুন setState বা নেভিগেশনের আগে
  • dispose()-এ টাইমার, স্ট্রিম, এবং লিসেনার বাতিল করুন
  • পরে ব্যবহার করার জন্য BuildContext স্টোর করা এড়িয়ে চলুন (ডাটা পাস করুন, কনটেক্সট নয়)
  • ব্যাকগ্রাউন্ড কলব্যাক থেকে রুট পুশ না করে যতক্ষণ না আপনি “ইউজার চলে গেছে” কেস হ্যান্ডেল করেন
  • প্রতিটি ফ্লোর (লগইন, অনবোর্ডিং, চেকআউট) জন্য কখন push, pushReplacement, এবং pop ব্যবহার করবেন সিদ্ধান্ত নিন

স্টেটের জন্য, rebuild-এ রিসেট হওয়া ভ্যালুগুলো দেখুন (রোটেশন, থিম পরিবর্তন, কীবোর্ড ওপেন/ক্লোজ)। যদি একটি ফর্ম, সিলেক্টেড ট্যাব, বা স্ক্রল পজিশন গুরুত্বপূর্ণ হয়, তা এমন জায়গায় স্টোর করুন যা রিবিল্ড টিকে টিকে থাকে, শুধু লোকাল ভ্যারিয়েবলে নয়।

কোনো ফ্লো “ডোন” বলার আগে একটি দ্রুত রিয়েল-ডিভাইস পাস চালান:

  • প্রতিটি স্ক্রিন থেকে Android ব্যাক চাপুন, ডায়ালগ এবং বটম শিট সহ
  • iOS ব্যাক সোয়াইপ প্রধান স্ক্রিনগুলোতে টেস্ট করুন (list→detail, settings→profile)
  • লোডিং চলাকালীন রোটেট করুন, তারপর ব্যাক চাপুন
  • একটি রিকোয়েস্ট চলাকালীন অ্যাপ ব্যাকগ্রাউন্ড করে পুনরায় খুলুন
  • নোটিফিকেশন বা ডিপ লিঙ্ক থেকে ওপেন করে ব্যাক আচরণ যাচাই করুন

আপনি যদি Koder.ai বা যেকোনো চ্যাট-ড্রিভেন ওয়ার্কফ্লো দিয়ে Flutter অ্যাপ বানান, এই চেকগুলো প্রথম দিকে করুন যখন নেভিগেশন নিয়মগুলো এখনও সহজেই বাস্তবায়ন করা যায়।

API ক্লায়েন্ট সামঞ্জস্য: “এক স্ক্রিনে কাজ করে” বাগ বন্ধ করুন

একটি সাধারণ শেষ-ব্রেকার হলো যখন প্রতিটি স্ক্রিন ব্যাকএন্ডের সাথে সামান্য ভিন্নভাবে কথা বলে। Vibe coding দিয়ে এটি সহজেই ঘটে: আপনি এক স্ক্রিনে “একটি দ্রুত লগইন কল” চান, তারপর অন্যটিতে “প্রোফাইল ফেচ” চান, এবং ফলে আপনি দু’/তিনটি HTTP সেটআপ নিয়ে শেষ হন যা মেলেনা।

একটি স্ক্রিন কাজ করে কারণ এটি সঠিক বেস URL এবং হেডার ব্যবহার করে। অন্যটি ব্যর্থ হয় কারণ এটি স্টেজিং দিকে ইঙ্গিত করে, একটি হেডার ভুলে যায়, অথবা টোকেন ভিন্ন ফরম্যাটে পাঠায়। বাগটি র‍্যান্ডম মনে হতে পারে, কিন্তু সাধারণত এটি কেবল অসামঞ্জস্য।

যে ফাঁকগুলো “এক স্ক্রিনে কাজ করে” সৃষ্টি করে

এগুলি বারবার দেখা যায়:

  • বিভিন্ন বেস URL, টাইমআউট, বা ডিফল্ট হেডার সহ একাধিক HTTP ক্লায়েন্ট
  • অসমঞ্জস্যপূর্ণ অথ রিফ্রেশ লজিক, যার ফলে 401 লুপ বা নিঃশব্দ লগআউট হয়
  • প্রতিটি স্ক্রিনে আলাদা পার্সিং ও এরর হ্যান্ডলিং, তাই একই ব্যাকএন্ড এরর তিন ভিন্ন মেসেজে রূপান্তরিত হয়
  • মিক্সড JSON পার্সিং স্টাইল (dynamic map এক জায়গায়, টাইপড মডেল অন্য জায়গায়), কিছু রেসপন্সে রানটাইম ক্র্যাশ ঘটায়

ফিক্স: এক ক্লায়েন্ট, এক কনট্রাক্ট, একভাবে ফেল করা

একটি একক API ক্লায়েন্ট তৈরি করুন এবং প্রতিটি ফিচার সেটি ব্যবহার করুক। সেই ক্লায়েন্ট বেস URL, হেডার, অথ টোকেন স্টোরেজ, রিফ্রেশ ফ্লো, রিট্রাই (যদি থাকে), এবং রিকোয়েস্ট লগিং নিজের দায়িত্বে নেবে।

রিফ্রেশ লজিক এক জায়গায় রাখুন যাতে আপনি সেটি নিয়ে রিজন করতে পারেন। যদি একটি রিকোয়েস্ট 401 দেয়, একবার রিফ্রেশ করে, তারপর রিকোয়েস্টটি একবার রিপ্লে করুন। যদি রিফ্রেশ ব্যর্থ হয়, লগআউট করুন এবং পরিষ্কার বার্তা দেখান।

টাইপড মডেল প্রত্যাশার চেয়ে বেশি সাহায্য করে। সফলতা ও এরর রেসপন্সের জন্য মডেল সংজ্ঞায়িত করুন যাতে সার্ভার কী পাঠিয়েছে তা অনুমান করতে না হয়। এররগুলোকে অ্যাপ-লেভেলের কয়েকটি আউটকামে ম্যাপ করুন (unauthorized, validation error, server error, no network) যাতে প্রতিটি স্ক্রিন একইভাবে আচরণ করে।

লগিংয়ের জন্য method, path, status code, এবং request ID রেকর্ড করুন। কখনো টোকেন, কুকি, বা পূর্ণ পে-লোড লগ করবেন না যাতে পাসওয়ার্ড বা কার্ড ডেটা ফাঁস হতে পারে। যদি বডি লগ দরকার হয়, “password” এবং “authorization” এর মত ফিল্ডগুলো রেড্যাক্ট করুন।

উদাহরণ: একটি সাইনআপ স্ক্রিন সফল, কিন্তু “edit profile” 401 লুপ করে। সাইনআপ পাঠায় Authorization: Bearer <token>, আর প্রোফাইল পাঠায় token=<token> কুয়েরি প্যারামে। এক শেয়ার্ড ক্লায়েন্ট থাকলে এই মিলভিন্নতা ঘটতেই পারতো না, এবং ডিবাগিং এত সহজ হবে যে একটি রিকোয়েস্ট ID মিলিয়ে সমস্যার পথ খুঁজে বের করা যায়।

ফর্ম ভ্যালিডেশন ফাঁক যা সাইনআপ ও পেমেন্ট ব্যর্থ করে

আপনার অগ্রগতিকে ক্রেডিটে পরিণত করুন
Koder.ai-এ আপনি যা বানালেন এবং যে শিক্ষা পেলেন তা শেয়ার করে ক্রেডিট পান।
ক্রেডিট অর্জন করুন

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

সবার কাছেই সবচেয়ে সাধারণ ইস্যু হলো অ্যাপের নিয়ম ও ব্যাকএন্ড নিয়মের মধ্যে মিল না থাকা। UI হয়ত ৩-চরিত্র পাসওয়ার্ড গ্রহণ করে, স্পেস সহ ফোন নম্বর গ্রহণ করে, অথবা একটি অপশনাল ফিল্ডকে বাধ্যতামূলক হিসেবে বিবেচনা করে, এবং তারপর সার্ভার এটি প্রত্যাখ্যান করে। ব্যবহারকারীরা কেবল “কিছু ভুল হয়েছে” দেখেন, পুনরায় চেষ্টা করেন, এবং অবশেষে ছেড়ে দেন।

ভ্যালিডেশনকে অ্যাপ জুড়ে শেয়ার্ড একটি ছোট চুক্তি হিসেবে বিবেচনা করুন। যদি আপনি চ্যাটের মাধ্যমে স্ক্রিন জেনারেট করেন (Koder.ai সহ), স্পষ্টভাবে বলুন: ব্যাকএন্ড কনস্ট্রেইন্টস ঠিক কী (min/max length, অনুমোদিত ক্যারেক্টার, রিকোয়ার্ড ফিল্ড, এবং ট্রিমিং মত নরমালাইজেশন)। এররগুলো ফিল্ডের পাশে সরল ভাষায় দেখান, শুধুমাত্র টোস্টে নয়।

আরেকটি ফাঁক হলো কীবোর্ড পার্থক্য iOS ও Android-এ। অটোকরেক্ট স্পেস যোগ করে, কিছু কীবোর্ড কোটস বা ড্যাশ বদলে দেয়, সংখ্যার কীবোর্ডে কিছু চরিত্র নাও থাকতে পারে (যেমন প্লাস সাইন), এবং কপি-পেস্ট অদৃশ্য ক্যারেক্টার নিয়ে আসে। যাচাই করার আগে ইনপুট নরমালাইজ করুন (ট্রিম, বারবার স্পেস কollapse করা, non-breaking স্পেস সরানো) এবং অত্যন্ত কঠোর regex এড়িয়ে চলুন যা স্বাভাবিক টাইপিংকে শাস্তি দেয়।

অ্যাসিঙ্ক ভ্যালিডেশনও শেষ মুহূর্ত সারপ্রাইজ তৈরি করে। উদাহরণ: আপনি ব্লার-এ “এই ইমেল কি আগে ব্যবহার হয়েছে?” চেক করেন, কিন্তু ব্যবহারকারী Submit চাপে দেয় রিকোয়েস্ট শেষ হওয়ার আগে। স্ক্রিন নেভিগেট করে, তারপর এরর আসে এবং একটি পেইজে দেখায় যা ব্যবহারকারী ইতিমধ্যেই ছেড়ে এসেছে।

ব্যবহারে যা রোধ করে:

  • ফর্ম স্টেটের জন্য এক সোর্স অব ট্রুথ রাখুন, isSubmitting এবং pendingChecks ট্র্যাক করুন
  • ফর্মটি ভ্যালিড এবং কোন অ্যাসিঙ্ক চেক পেন্ডিং নেই এমন না হলে Submit নিষ্ক্রিয় করুন
  • স্টেইল অ্যাসিঙ্ক রেসপন্স বাতিল বা ইগনোর করুন রিকোয়েস্ট ID বা “latest value wins” চেক দিয়ে
  • প্রতিটি ফিল্ডের জন্য এক পরিষ্কার এরর দেখান, এবং সার্ভার এররের জন্য একটি সংক্ষিপ্ত সারসংক্ষেপ

দ্রুত টেস্ট করতে, হ্যাপি পাথ ছাড়িয়ে যান। কিছু ব্রুটাল ইনপুট ট্রাই করুন:

  • প্রতিটি রিকোয়ার্ড ফিল্ডে খালি সাবমিট
  • বর্ডারলাইন মান (min length, max length, এক অক্ষর বেশি)
  • লিডিং ও ট্রেইলিং স্পেসসহ কপি-পেস্ট
  • আন্তর্জাতিক ফোন নম্বর ও non-US ঠিকানাগুলো
  • ধীর নেটওয়ার্ক (অ্যাসিঙ্ক চেক দেরি করে)

এগুলো পাস করলে, সাইনআপ ও পেমেন্ট রিলিজের আগে ভাঙার সম্ভাবনা অনেক কমে।

প্ল্যাটফর্ম পারমিশন: সাধারণ Android এবং iOS ফাঁদ

পারমিশন হলো “এটি কালকে কাজ করছিল” বাগগুলোর শীর্ষ কারণ। চ্যাট-নির্মিত প্রজেক্টে একটি ফিচার দ্রুত যোগ করা হয় এবং প্ল্যাটফর্ম নিয়মগুলো চাপা পড়ে যায়। অ্যাপ সিমুলেটরে চলে, তারপর রিয়েল ফোনে ব্যর্থ হয়, অথবা শুধুমাত্র ব্যবহারকারী “Don’t Allow” করলে কাজ বন্ধ হয়ে যায়।

টিমগুলো সাধারণত কোথায় আটকে যায়

একটি ফাঁদ হলো প্ল্যাটফর্ম ডিক্লারেশন অনুপস্থিত থাকা। iOS-এ আপনাকে পরিষ্কার usage text দিতে হবে কেন আপনি ক্যামেরা, লোকেশন, ফটো ইত্যাদি চান। যদি তা অনুপস্থিত বা অস্পষ্ট হয়, iOS প্রম্পট ব্লক করতে পারে বা App Store রিভিউ বিল্ড রিজেক্ট করতে পারে। Android-এ ভুল ম্যানিফেস্ট এন্ট্রি বা OS ভার্সনের জন্য ভুল পারমিশন ব্যবহার করলে কলগুলি নীরবে ব্যর্থ হতে পারে।

আর একটি ফাঁদ হলো পারমিশনকে একবারের সিদ্ধান্ত ধরে নেওয়া। ব্যবহারকারীরা অস্বীকার করতে পারে, পরে সেটিংসে রিভোক করতে পারে, অথবা Android-এ “Don’t ask again” বেছে নিতে পারে। যদি আপনার UI ফলের জন্য চিরতরে অপেক্ষা করে, আপনি একটি ফ্রোজেন স্ক্রিন বা এমন একটি বোতাম পাবেন যা কিছুই করে না।

OS ভার্সনগুলোও ভিন্ন আচরণ করে। নোটিফিকেশন একটি ক্লাসিক উদাহরণ: Android 13+ রUNTIME পারমিশন চায়, পুরনো ভার্সন চায় না। ফটো ও স্টোরেজ অ্যাক্সেস উভয় প্ল্যাটফর্মেই বদলেছে: iOS-এ “limited photos” আছে, এবং Android-এ নতুন “media” পারমিশন আছে যা বিস্তৃত স্টোরেজের বদলে। ব্যাকগ্রাউন্ড লোকেশন দুটো প্ল্যাটফর্মেই আলাদা ক্যাটেগরি এবং প্রায়ই অতিরিক্ত ধাপ ও স্পষ্ট ব্যাখ্যা প্রয়োজন।

পারমিশনকে একটি ছোট স্টেট মেশিন হিসাবে হ্যান্ডেল করুন, একটি একক হ্যা/না চেক হিসেবে নয়:

  • ব্যবহারকারী ফিচার ট্রিগার করলে মাত্রই অনুরোধ করুন (অ্যাপ লঞ্চে নয়)
  • যদি অস্বীকার করা হয়, সংক্ষিপ্ত ব্যাখ্যা দেখান এবং “Try again” অফার করুন
  • যদি স্থায়ীভাবে অস্বীকার করা হয়, সেটিংসে কীভাবে সক্রিয় করতে হয় দেখান এবং নিরাপদ বিকল্প প্রদান করুন
  • iOS “limited” (ফটো) কে একটি বৈধ অবস্থা হিসেবে গ্রহণ করুন, ত্রুটি নয়

তারপর রিয়েল ডিভাইসে প্রধান পারমিশন স্যুরফেসগুলো টেস্ট করুন। একটি দ্রুত চেকলিস্ট বেশিরভাগ সারপ্রাইজ ধরবে:

  • ক্যামেরা: খুলুন, ছবি নিন, ক্যান্সেল করুন, আবার চেষ্টা করুন
  • ফটো/স্টোরেজ: একটি ইমেজ পিক করুন, iOS-এ “limited photos” হ্যান্ডেল করুন
  • নোটিফিকেশন: Android 13+ প্রম্পট, তারপর একটি বাস্তব নোটিফিকেশন আসা যাচাই করুন
  • লোকেশন: while-in-use বনাম background, এবং iOS-এ “precise” বনাম “approximate” যাচাই
  • সেটিংসে পরিবর্তন: প্রথমে অস্বীকার করুন, পরে সক্রিয় করে অ্যাপ পুনরুদ্ধার করে দেখুন

উদাহরণ: আপনি একটি চ্যাট সেশনে “প্রোফাইল ফটো আপলোড” যোগ করেছেন এবং এটি আপনার ফোনে কাজ করে। কিন্তু নতুন একজন ইউজার একবার ছবি অ্যাক্সেস অস্বীকার করে, এবং অনবোর্ডিং পরে চালিয়ে যেতে পারে না। ফিক্সটি বেশি UI পলিশ নয়। এটি হল “অস্বীকার”কে একটি সাধারণ ফলাফল হিসেবে বিবেচনা করা এবং একটি বিকল্প অফার করা (ফটো ছাড়া এগিয়ে যান), আবার শুধুমাত্র যখন ব্যবহারকারী ফিচারটি চেষ্টা করে তখন পুনরায় অনুরোধ করা।

আপনি যদি Koder.ai দিয়ে Flutter কোড জেনারেট করেন, প্রতিটি ফিচারের গ্রহণ-চেকলিস্টে পারমিশন যোগ করুন। সঠিক ডিক্লারেশন ও স্টেট প্রথম থেকেই যোগ করা দ্রুত, বনাম পরে স্টোর রিজেকশন বা আটকে থাকা অনবোর্ডিং মেরামত করা।

রিলিজ বিল্ড ফাঁক: শিপ করলে কি পরিবর্তন ঘটে

আপনার কোডের মালিকানা রাখুন
যেকোনো সময় সোর্স কোড এক্সপোর্ট করুন যাতে প্যাটার্ন রিভিউ করে ড্রিফট ধরতে পারেন।
কোড এক্সপোর্ট করুন

একটি Flutter অ্যাপ ডিবাগে নিখোঁজ দেখালেও রিলিজে ভেঙে পড়তে পারে। রিলিজ বিল্ড ডিবাগ সহায়ক বর্জন করে, কোড shrink করে, এবং রিসোর্স ও কনফিগ নিয়ে কঠোরতর নিয়ম প্রয়োগ করে। অনেক সমস্যা কেবল তখনই দেখা দেয় যখন আপনি সেই সুইচটি ফ্লিপ করেন।

ডিবাগ চলে, রিলিজে ক্র্যাশ

রিলিজে Flutter ও প্ল্যাটফর্ম টুলচেইন অনুপস্থিত মনে হওয়া কোড ও অ্যাসেটগুলো বেশি আগ্রাসীভাবে সরিয়ে দেয়। এটি রিফ্লেকশন-ভিত্তিক কোড, “ম্যাজিক” JSON পার্সিং, ডাইনামিক আইকন নাম, বা সঠিকভাবে ডিক্লেয়ার না করা ফন্ট ভাঙতে পারে।

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

শুরুতেই ও বারবার রিলিজ বিল্ড চালান, তারপর প্রথম কয়েক সেকেন্ড দেখুন: স্টার্টআপ আচরণ, প্রথম নেটওয়ার্ক অনুরোধ, প্রথম নেভিগেশন। আপনি যদি কেবল হট রিলোড দিয়ে টেস্ট করেন, কোল্ড-স্টার্ট আচরণ মিস করবেন।

ফ্লেভার ও এনভায়রনমেন্ট ভ্যারিয়েবল যা রিলিজে নেই

টিমগুলো প্রায়ই ডেভ API বিরুদ্ধে টেস্ট করে, তারপর ধরে নেয় প্রোডাকশন সেটিংস "ঠিক থাকবে"। কিন্তু রিলিজ বিল্ডগুলো আপনার env ফাইল অন্তর্ভুক্ত নাও করতে পারে, আলাদা applicationId/bundleId থাকতে পারে, বা পুশ নোটিফিকেশনের জন্য সঠিক কনফিগ নাও থাকতে পারে।

দ্রুত চেক যা বেশিরভাগ সারপ্রাইজ প্রতিরোধ করে:

  • একটি রিয়েল ডিভাইসে রিলিজ বিল্ড বানান ও ইনস্টল করুন (শুধু এমুলেটরে নয়)
  • প্রতিটি ফ্লেভারের জন্য সঠিক সাইনিং ও প্যাকেজ নাম যাচাই করুন
  • বেস URL, API কী, এবং অ্যানালিটিক্স ফ্ল্যাগ প্রোডাকশন সেটিংসে আছে কিনা নিশ্চিত করুন
  • ক্লিন ইনস্টল থেকে লগইন, লগআউট, এবং টোকেন রিফ্রেশ টেস্ট করুন
  • ডিপ লিঙ্ক ও পুশ নোটিফিকেশন সঠিক স্ক্রিন খুলে কিনা যাচাই করুন

“শেষ মূহুর্তের কাজ” যা বাধা হয়ে দাঁড়ায়

অ্যাপ সাইজ, আইকন, স্প্ল্যাশ স্ক্রিন, এবং ভার্সনিং প্রায়ই পরে ধাক্কা খায়। তখন আপনি দেখেন রিলিজটি বড়, আইকন ঝাপসা, স্প্ল্যাশ কাটা, অথবা স্টোরের জন্য ভার্সন/বিল্ড নম্বর ভুল।

এসব জিনিস আপনি ভাবার চেয়ে আগে করুন: Android ও iOS এর জন্য সঠিক অ্যাপ আইকন সেট করুন, নিশ্চিত করুন স্প্ল্যাশ ছোট ও বড় স্ক্রিনে ঠিক দেখায়, এবং ভার্সনিং নিয়ম নির্ধারণ করুন (কে কখন কি বাড়াবে)।

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

আপনি যদি Koder.ai-এর মতো চ্যাট-ড্রিভেন টুল দিয়ে Flutter অ্যাপ জেনারেট করেন, “রিলিজ বিল্ড চালান” আপনার নরমাল লুপের অংশ করুন, শেষ দিনের না। এটি ছোট পরিবর্তনের সময়ে বাস্তব-বিশ্বের ইস্যুগুলো ধরার দ্রুত পথ।

১২টি সাধারণ vibe coding ভুল (এবং কিভাবে এড়াবেন)

চ্যাট-নির্মিত Flutter প্রোজেক্টগুলো শেষ মুহূর্তে ভেঙে পড়ে কারণ চ্যাটে ছোট পরিবর্তনগুলো প্রকৃত অ্যাপে বহু গতিশীল অংশ স্পর্শ করে। এই ভুলগুলো সাধারণত একটি পরিষ্কার ডেমোকে বিশৃঙ্খল রিলিজে পরিণত করে।

  1. নতুন ফিচার যোগ করা কিন্তু স্টেট ও ডেটা ফ্লো প্ল্যান আপডেট না করা। যদি একটি নতুন স্ক্রিন একই ডেটা চায়, কোড পেস্ট করার আগে ঠিক করুন ডেটা কোথায় থাকবে।

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

  3. প্রতি স্ক্রিনে “ওয়ান-অফ” API কল তৈরি করা। অনুরোধগুলোকে একটি একক ক্লায়েন্ট/সার্ভিসের পিছনে রাখুন যাতে পাঁচটি সামান্য আলাদা হেডার, বেস URL, এবং এরর নিয়ম না হয়।

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

  5. ওয়ার্নিংগুলোকে নোইজ ধরা। Analyzer হিন্ট, ডিপ্রেকেশন, এবং “এটি সরানো হবে” মেসেজগুলি প্রাথমিক শঙ্কা।

  6. সিমুলেটরকে বাস্তব ফোন মনে করা। ক্যামেরা, নোটিফিকেশন, ব্যাকগ্রাউন্ড রিসিউম, এবং ধীর নেটওয়ার্ক রিয়েল ডিভাইসে ভিন্ন আচরণ করে।

  7. নতুন উইজেটে স্ট্রিং, কালার, ও স্পেসিং হার্ডকোড করা। ছোট অসামঞ্জস্য জমে উঠে, এবং অ্যাপ টুকরো টুকরো লাগতে শুরু করে।

  8. ফর্ম ভ্যালিডেশনকে স্ক্রিন অনুযায়ী ভিন্নতে ছেড়ে দেওয়া। যদি একটি ফর্ম স্পেস ট্রিম করে আর অন্যটি না করে, আপনি “এটা আমার কাছে চলে” ব্যর্থতা পাবেন।

  9. প্ল্যাটফর্ম পারমিশন ফিচার “ডোন” হওয়ার আগে ভুলে যাওয়া। ফটো, লোকেশন, বা ফাইল প্রয়োজন হলে ফিচারটি তখনই সম্পন্ন যে এটি পারমিশন অস্বীকৃতি ও অনুমোদন উভয় কেসে কাজ করে।

  10. ডিবাগ-শুধু আচরণের উপর নির্ভর করা। কিছু লগ, assertion, এবং শিথিল নেটওয়ার্ক সেটিংস রিলিজে চলে যায়।

  11. দ্রুত পরীক্ষার পর পরিষ্কার-পরিচ্ছন্নতা বাদ দেওয়া। পুরনো ফ্ল্যাগ, অনবহিত এন্ডপয়েন্ট, এবং মৃত UI ব্রাঞ্চ পরে সারপ্রাইজ সৃষ্টি করে।

  12. “ফাইনাল সরে” সিদ্ধান্তের মালিকানা না থাকা। Vibe coding দ্রুত, কিন্তু নামকরণ, স্ট্রাকচার, এবং “এটাই আমাদের পদ্ধতি” নির্ধারণ করার একজন এগিয়ে থাকা দরকার।

দ্রুতভাবে গতি বজায় রেখে বিশৃঙ্খলা এড়ানোর একটি ব্যবহারিক উপায় হলো প্রতিটি অর্থবহ পরিবর্তনের পরে একটি ছোট রিভিউ:

  • নতুন কোড আপনার রাউটিং এবং স্টেট প্যাটার্ন অনুসরণ করে কিনা নিশ্চিত করুন
  • API কল একই ক্লায়েন্ট ও এরর হ্যান্ডলিং ব্যবহার করে কিনা চেক করুন
  • এনালাইজার চালান এবং নতুন ওয়ার্নিংগুলো তৎক্ষণাৎ ঠিক করুন
  • হ্যাপি পাথ এবং একটি ফেইল পাথ (অফলাইন, ভুল ইনপুট, পারমিশন অস্বীকার) টেস্ট করুন
  • আরও ফিচার যোগ করার আগে একটি দ্রুত রিয়েল-ডিভাইস চালান

উদাহরণ দৃশ্য: ডেমো থেকে স্টোর-রেডি হওয়া পুনর্লিখন ছাড়াই

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

একটি ছোট টিম চ্যাট-ভিত্তিক টুল দিয়ে একটি সরল Flutter অ্যাপ বানায়: লগইন, একটি প্রোফাইল ফর্ম (নাম, ফোন, জন্মদিন), এবং API থেকে আইটেমের একটি লিস্ট ফেচ। ডেমোতে সবকিছু ঠিক দেখায়। তারপর রিয়েল-ডিভাইস টেস্ট শুরু হয় এবং সাধারণ সমস্যা একসাথে উঠে আসে।

প্রথম সমস্যা লোগইনের ঠিক পরেই আসে। অ্যাপ হোম স্ক্রিন পুশ করে, কিন্তু ব্যাক বাটন লগইন পাতায় ফিরে যায়, এবং কখনও UI পুরোনো স্ক্রিন ফ্ল্যাশ করে। কারণটি প্রায়শই মিক্স করা নেভিগেশন স্টাইল: কিছু স্ক্রিন push ব্যবহার করে, অন্যগুলো replace করে, এবং auth স্টেট দুই জায়গায় চেক করা হয়।

পরেরটা আসে API লিস্ট থেকে। একটি স্ক্রিন লোড করে, কিন্তু অন্য একটি স্ক্রিন 401 দেয়। টোকেন রিফ্রেশ আছে, কিন্তু শুধুমাত্র একটি API ক্লায়েন্ট সেটেই ব্যবহার করা হচ্ছে। এক স্ক্রিন র র সোজা HTTP কল ব্যবহার করে, অন্যটি হেল্পার ব্যবহার করে। ডিবাগে ধীর টাইমিং ও ক্যাশড ডেটা অসামঞ্জস্য লুকাতে পারে।

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

একটি পারমিশন সারপ্রাইজ পরে আসে: iOS-এ নোটিফিকেশন পারমিশন অনবোর্ডিংর প্রথম লঞ্চে পপ আপ করে। অনেক ব্যবহারকারী “Don’t Allow” ট্যাপ করে কেবল এগিয়ে যেতে, এবং পরে গুরুত্বপূর্ণ আপডেট মিস করে।

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

টিমটি একটি স্প্রিন্টে সবকিছু পুনর্লিখন না করে কিভাবে ঠিক করে:

  • স্কোপ ফ্রিজ করে, বর্তমান কোড এক্সপোর্ট করে, এবং একটি ক্লিন স্ন্যাপশট থেকে কাজ করে যাতে পরিবর্তনগুলো রোলব্যাক করা সহজ হয়
  • অথ স্টেটের জন্য এক সোর্স অফ ট্রুথ বানায় (এবং একটি নেভিগেশন নিয়ম: সফল হলে লগইনকে হোম দিয়ে replace করা)
  • হেডার, রিফ্রেশ, এবং কনসিস্টেন্ট এরর ম্যাপিং-এর জন্য একক API ক্লায়েন্ট স্ট্যান্ডার্ডাইজ করে
  • সার্ভারের সাথে ফর্ম রুলগুলো মিলিয়ে (একই রিকোয়ার্ড ফিল্ড, একই ফরম্যাট, ফিল্ড-লেভেল মেসেজ) নেওয়া
  • পারমিশন প্রম্পটগুলো তখনি সরান যখন প্রয়োজন, এবং একটি ফুল রিলিজ বিল্ড রিয়েল ডিভাইসে যাচাই করে

Koder.ai-এর মতো টুলগুলো এখানে সাহায্য করে কারণ আপনি প্ল্যানিং মোডে ইটারেট করতে পারেন, ছোট প্যাচ হিসেবে ফিক্স প্রয়োগ করতে পারেন, এবং স্ন্যাপশট টেস্ট করে ঝুঁকি কম রাখতে পারেন।

শিপ করার আগে দ্রুত চেক এবং পরবর্তী ধাপ

শেষ মুহূর্তের সারপ্রাইজ এড়াতে দ্রুত একই ছোট চেক প্রতিটি ফিচারের জন্য করুন, এমনকি যখন আপনি চ্যাটে দ্রুত তৈরি করেছেন। বেশিরভাগ সমস্যা “বড় বাগ” নয়—এগুলি ছোট অসামঞ্জস্য যা কেবল তখনই দেখা দেয় যখন স্ক্রিনগুলো সংযুক্ত হয়, নেটওয়ার্ক ধীর, বা OS “না” বলে।

যে কোন ফিচারকে “ডোন” বলার আগে দুই মিনিটের একটি পাস করুন:

  • কি আপনি ঠান্ডা স্টার্ট থেকে স্ক্রিনটি পৌঁছাতে পারেন, এবং কি বিরক্তিকর লুপ ছাড়া ফিরে যেতে পারেন?
  • স্টেট কি এক জায়গায় রাখা আছে (প্রতিটি রিবিল্ডে পুনরায় তৈরি না হয়ে), এবং নেভিগেশন পার হলে টিকে থাকে?
  • কি API কল একই ক্লায়েন্ট, বেস URL, হেডার, এবং টাইমআউট ব্যবহার করে?
  • ফর্মগুলো সাবমিটের আগে ভ্যালিড করে, স্পষ্ট মেসেজ দেখায়, এবং লোডিং-এর সময় ডাবল-ট্যাপ ব্লক করে?
  • যদি এটি পারমিশন চায়, আপনি কি “Allow” ও “Don’t allow” উভয় ফ্লো টেস্ট করেছেন?

তারপর একটি রিলিজ-ফোকাসড চেক চালান। অনেক অ্যাপ ডিবাগে নিখুঁত মনে হয় কিন্তু রিলিজে সাইনিং, কড়া সেটিং, বা অনুপস্থিত পারমিশন টেক্সটের কারণে ফেল করে:

  • একটি রিলিজ বিল্ড তৈরি করে চালান, তারপর মেইন ফ্লো গুলো এন্ড-টু-এন্ড টেস্ট করুন
  • দুইটি রিয়েল ডিভাইসে টেস্ট করুন (একটি পুরনো, একটি নতুন) বিভিন্ন স্ক্রিন সাইজসহ
  • ভার্সন, বিল্ড নম্বর, এবং সাইনিং কনফিগ সঠিক কিনা নিশ্চিত করুন
  • প্ল্যাটফর্ম পারমিশন ডিক্লারেশন যাচাই করুন (Android manifest, iOS Info.plist)
  • বাগ রিপোর্ট করলে পুনরুত্পাদনের ধাপ, ডিভাইস ও OS ভার্সন, লগ, এবং নেটওয়ার্ক অবস্থা (Wi-Fi বনাম সেলুলার) জুড়ে দিন

প্যাচ বনাম রিফ্যাক্টর: ইস্যা যদি বিচ্ছিন্ন হয় (এক স্ক্রিন, এক API কল, এক ভ্যালিডেশন রুল) তবে প্যাচ করুন। যদি আপনি একই জিনিস তিনবার দেখেন (তিনটি স্ক্রিন তিনটি আলাদা ক্লায়েন্ট ব্যবহার করছে, ডুপ্লিকেটেড স্টেট লজিক, বা নেভিগেশন রুটগুলো অমিল), তাহলে রিফ্যাক্টর করুন।

আপনি যদি Koder.ai ব্যবহার করে চ্যাট-ড্রিভেন বিল্ড করেন, বড় পরিবর্তনের আগে প্ল্যানিং মোড ব্যবহার করুন (যেমন স্টেট ম্যানেজমেন্ট বা রাউটিং পরিবর্তন)। স্ন্যাপশট এবং রোলব্যাকও ব্যবহার করুন যাতে ঝুঁকি কম থাকে, দ্রুত রিভার্ট করে একটি ছোট ফিক্স শিপ করা যায়, এবং পরের ইটারেশনে কাঠামো উন্নত করা যায়।

সাধারণ প্রশ্ন

What’s the fastest way to stop late-breaking bugs in a chat-built Flutter app?

ছোট একটি শেয়ার্ড ফ্রেম দিয়ে শুরু করুন, তারপর অনেকগুলো স্ক্রিন জেনারেট করুন:

  • এক ধরনের নেভিগেশন (এবং push, replace, এবং back আচরণের নিয়ম)
  • এক ধরনের স্টেট প্যাটার্ন (স্টেট কে ধরে রাখে, কোথায় রাখে)
  • এক API ক্লায়েন্ট (বেস URL, হেডার, রিফ্রেশ, এরর ম্যাপিং)
  • প্রতিটি ফিচারের জন্য একটি মিনি টেস্ট প্ল্যান (হ্যাপি পাথ + ২ টি এজ কেস)

এভাবে চ্যাট-জেনারেটেড কোড এককভাবে “ওয়ান-অফ” স্ক্রিনে পরিণত হওয়া থেকে রোধ হয়।

Why does everything look fine in a demo, then break later?

কারণ একটি ডেমো প্রমাণ করে “এটি একবার চলে”, আর বাস্তব অ্যাপকে ঝামেলাভরা পরিস্থিতিতে চালিয়ে যেতে হয়:

  • ব্যাক জেসচার/বাটন, রোটেশন, ব্যাকগ্রাউন্ড/রিসিউম
  • ধীর বা অনিয়মিত নেটওয়ার্ক, অফলাইন মোড
  • পারমিশন অস্বীকৃতি এবং OS-নির্দিষ্ট আচরণ
  • রিলিজ-শুধু পরিবর্তন (কোড শৃঙ্কিং, অনুপস্থিত অ্যাসেট/কনফিগ)

এই সমস্যাগুলো সাধারণত তখনই দেখা দেয় যখন একাধিক স্ক্রিন কনেক্ট করে এবং বাস্তব ডিভাইসে টেস্ট করা হয়।

Which real-device tests catch the most issues quickly?

শুরুতে একটি দ্রুত রিয়েল-ডিভাইস পাস করুন, শেষের দিকে নয়:

  • কমপক্ষে একটি Android ফোন ও একটি iPhone-এ ইনস্টল করুন
  • লোডিং চলাকালীন রোটেট করুন, তারপর ব্যাক চাপুন
  • রিকোয়েস্ট চলাকালীন অ্যাপ ব্যাকগ্রাউন্ড করে পুনরায় খুলুন
  • এয়ারপ্লেন মোড টগল করে ফ্লো পুনরায় চালান
  • সম্ভব হলে একটি পুরনো/ধীর ডিভাইস টেস্ট করুন

ইমুলেটর কাজে লাগে, কিন্তু অনেক টাইমিং, পারমিশন, এবং হার্ডওয়্যার-সংক্রান্ত সমস্যা ধরবে না।

How do I prevent “setState() called after dispose()” errors?

এটি সাধারণত একটি await-এর পরে ঘটে যখন ইউজার স্ক্রিন ছেড়ে যায় (অথবা OS উইজেটটা পুনর্নির্মাণ করে), এবং আপনার কোড তখনও setState বা নেভিগেশন কল করে।

প্রাকটিক্যাল ফিক্স:

  • await-এর পরে if (!context.mounted) return; চেক করুন
  • dispose()-এ টাইমার/স্ট্রিম/লিসেনার বাতিল করুন
  • পরবর্তীতে BuildContext সংরক্ষণ করা থেকে বিরত থাকুন

এগুলো “লেট কলব্যাক”কে মৃত উইজেট টাচ করতে বাধা দেয়।

Why does the back button/gesture behave differently across screens?

একটি রাউটিং প্যাটার্ন বাছাই করুন এবং সহজ নিয়ম লিখে প্রতিটি নতুন স্ক্রিনকে তা মানতে বলুন। সাধারণ কষ্টের পয়েন্ট:

  • নামযুক্ত রুট, সরাসরি উইজেট পুশ, এবং নেস্টেড নেভিগেটর মিশিয়ে ফেলা
  • অস্থায়ীভাবে push বনাম pushReplacement ব্যবহারে অনিয়ম
  • ডিপ লিংক কোন “হোম” ব্যাক ইতিহাস ছাড়া ডিটেইলে খোলে

প্রতিটি বড় ফ্লো (লগইন/অনবোর্ডিং/চেকআউট) জন্য একটি নিয়ম নির্ধারণ করুন এবং উভয় প্ল্যাটফর্মে ব্যাক আচরণ টেস্ট করুন।

How do I stop “works on one screen” API bugs?

কারণ চ্যাট-জেনারেটেড ফিচারগুলো প্রায়ই তাদের নিজস্ব HTTP সেটআপ তৈরি করে। এক স্ক্রিন ভিন্ন বেস URL, হেডার, টাইমআউট, অথবা টোকেন ফরম্যাট ব্যবহার করতে পারে।

এটি সারাতে বলুন:

  • পুরো অ্যাপে একটি API ক্লায়েন্ট ব্যবহার করুন
  • অথ টোকেন স্টোরেজ ও রিফ্রেশ এক জায়গায় রাখুন
  • একইরকম এরর ম্যাপিং (unauthorized, validation, server, offline) ব্যবহার করুন

তাহলে প্রতিটি স্ক্রিন একইভাবে “ভুলি” করবে, ফলে বাগ ধরা সহজ হবে।

What’s a safe default approach for token refresh to avoid 401 loops?

রিফ্রেশ লজিক এক জায়গায় রাখুন এবং সরল রাখুন:

  • 401 এ: একবার রিফ্রেশ করুন
  • আসল রিকোয়েস্ট একবার রিপ্লে করুন
  • রিফ্রেশ ব্যর্থ হলে: ফোর্স লগআউট এবং পরিষ্কার বার্তা দেখান

কিছু লগ রাখুন (method/path/status এবং request ID), কিন্তু টোকেন বা সংবেদনশীল তথ্য কখনো লগ করবেন না।

How can I avoid form validation failures that show up only with real users?

UI ভ্যালিডেশনকে ব্যাকএন্ড রুলের সাথে মিলান এবং যাচাই করার আগে ইনপুট নরমালাইজ করুন।

প্রাকটিক্যাল ডিফল্ট:

  • চেকের আগে স্পেস ট্রিম করুন ও অদৃশ্য ক্যারেক্টার সরান
  • ফিল্ড-লেভেলের এরর ফিল্ডের পাশে দেখান (শুধু টোস্ট নয়)
  • isSubmitting ট্র্যাক করুন এবং ডাবল-ট্যাপ ব্লক করুন
  • অ্যাসিঙ্ক চেকের জন্য (যেমন “email already used”) স্টেইল রেসপন্স ইগনোর করুন একটি রিকোয়েস্ট ID দিয়ে

তারপর ব্রুটাল ইনপুটগুলো টেস্ট করুন: খালি সাবমিট, মিন/ম্যাক্স লেন্থ, কপি-পেস্ট স্পেসসহ, ধীর নেটওয়ার্ক ইত্যাদি।

What are the most common permission mistakes that cause rejections or stuck screens?

পারমিশনকে একটি ছোট স্টেট মেশিন হিসেবে হ্যান্ডেল করুন, একবারের হ্যাঁ/না হিসেবে নয়:

  • কেবল সেই মুহূর্তে রিকোয়েস্ট করুন যখন ইউজার ফিচার ট্রিগার করে (অ্যাপ লঞ্চে নয়)
  • যদি অস্বীকার করা হয়, একটি সংক্ষিপ্ত ব্যাখ্যা দেখান এবং “Try again” অফার করুন
  • যদি স্থায়ীভাবে অস্বীকার করা হয়, সেটিংসে কীভাবে সক্রিয় করতে হয় দেখান এবং একটি নিরাপদ বিকল্প দিন
  • iOS-এর “limited photos”-কে একটি বৈধ অবস্থায় গণ্য করুন

এছাড়া প্রয়োজনীয় প্ল্যাটফর্ম ডিক্লারেশন (iOS usage text, Android manifest) নিশ্চিত করুন ফিচারকে “ডান” বলার আগে।

Why does the app work in debug but crash or behave differently in release?

রিলিজ বিল্ড ডিবাগ সহায়কগুলো সরিয়ে দেয় এবং অনাকাঙ্ক্ষিতভাবে এমন কোড/অ্যাসেট বাদ দিতে পারে যেগুলোকে আপনি ডিবাগে নির্ভর করছিলেন।

প্রাকটিক্যাল রুটিন:

  • শীঘ্রই একটি রিলিজ বিল্ড বানান এবং ইনস্টল করুন (শুধু ডিবাগ নয়)
  • সাইনিং, bundleId/applicationId, এবং প্রোডাকশন বেস URL যাচাই করুন
  • কোল্ড-স্টার্ট টেস্ট করুন: অ্যাপ পুরোপুরি বন্ধ করে আবার খুলুন
  • প্রথম নেভিগেশন, প্রথম API কল, ডিপ লিংক এবং পুশ ওপেন স্মোক-টেস্ট করুন

রিলিজে সমস্যা হলে সন্দেহ করুন অনুপস্থিত অ্যাসেট/কনফিগ, ভুল এনভায়রনমেন্ট সেটিং, বা ডিবাগ-নির্ভর কোডের প্রতি।

সূচিপত্র
কেন চ্যাট-ভিত্তিক বিল্ডে Flutter প্রকল্পগুলো শেষ মুহূর্তে ভেঙে যায়একটি সহজ সেটআপ যা বেশিরভাগ শেষ মুহূর্তের সারপ্রাইজ প্রতিরোধ করে (ধাপে ধাপে)নেভিগেশন এবং স্টেটের ফাঁক যা রিয়েল ডিভাইসে দেখা যায়API ক্লায়েন্ট সামঞ্জস্য: “এক স্ক্রিনে কাজ করে” বাগ বন্ধ করুনফর্ম ভ্যালিডেশন ফাঁক যা সাইনআপ ও পেমেন্ট ব্যর্থ করেপ্ল্যাটফর্ম পারমিশন: সাধারণ Android এবং iOS ফাঁদরিলিজ বিল্ড ফাঁক: শিপ করলে কি পরিবর্তন ঘটে১২টি সাধারণ vibe coding ভুল (এবং কিভাবে এড়াবেন)উদাহরণ দৃশ্য: ডেমো থেকে স্টোর-রেডি হওয়া পুনর্লিখন ছাড়াইশিপ করার আগে দ্রুত চেক এবং পরবর্তী ধাপসাধারণ প্রশ্ন
শেয়ার