Dio হল Dart এবং Flutter-এর জন্য একটি শক্তিশালী HTTP ক্লায়েন্ট, যা চীনা প্রকৌশলী Wenda Wang দ্বারা তৈরি। লাইব্রেরিটি ইন্টারসেপ্টর, FormData, ফাইল আপলোড এবং অনুরোধ বাতিলের সমর্থন সহ একটি উন্নত API প্রদান করে। pub.dev, 2025 অনুসারে, Dio হল Flutter ইকোসিস্টেমে সবচেয়ে জনপ্রিয় HTTP ক্লায়েন্ট, যার GitHub-এ 8 হাজারেরও বেশি তারকা রয়েছে।
মূল বিষয়
Dio হল Dart ভাষার জন্য একটি শক্তিশালী HTTP ক্লায়েন্ট লাইব্রেরি, যা Flutter অ্যাপ্লিকেশনে সবচেয়ে বেশি ব্যবহৃত হয়। Dio ইন্টারসেপ্টর, গ্লোবাল কনফিগারেশন, ট্রান্সফরমার, FormData, ফাইল আপলোড এবং নমনীয় টাইমআউট ব্যবস্থাপনার সমর্থন সহ একটি সমৃদ্ধ API প্রদান করে, যা একে Flutter কমিউনিটিতে নেটওয়ার্কিংয়ের জন্য প্রাথমিক পছন্দ করে তোলে।
লাইব্রেরিটি Wenda Wang 2018 সালে তৈরি করেছিলেন অন্তর্নির্মিত dart:io HttpClient-এর বিকল্প হিসাবে, যাতে অনেক আধুনিক ক্ষমতার অভাব ছিল: সমস্ত অনুরোধের জন্য ইউনিফাইড কনফিগারেশন, ইন্টারসেপ্টর এবং স্বয়ংক্রিয় সিরিয়ালাইজেশন। 2025 সালের মধ্যে, Dio জনপ্রিয়তায় Dart টিমের http প্যাকেজকে ছাড়িয়ে গেছে, pub.dev অনুসারে Flutter ইকোসিস্টেমে HTTP ক্লায়েন্টদের মধ্যে প্রথম স্থান অধিকার করেছে।
Dio তিনটি অ্যাডাপ্টার সমর্থন করে: DartNativeAdapter (Android, iOS, Desktop-এ ডিফল্ট), BrowserAdapter (Web-এ) এবং IOAdapter। অ্যাডাপ্টারটি প্ল্যাটফর্মের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে নির্বাচিত হয়। Dio সমস্ত Flutter প্ল্যাটফর্ম — Android, iOS, Web, macOS, Windows এবং Linux-এর জন্য একটি ইউনিফাইড ইন্টারফেসও প্রদান করে।
Dio-র আর্কিটেকচার হ্যান্ডলার চেইনের উপর নির্মিত। প্রতিটি অনুরোধ ইন্টারসেপ্টরগুলির একটি ক্রমের মধ্য দিয়ে যায় যা অনুরোধ (InterceptorsWrapper.onRequest), প্রতিক্রিয়া (onResponse) পরিবর্তন করতে পারে বা ত্রুটি (onError) পরিচালনা করতে পারে। ইন্টারসেপ্টরগুলির পরে, অনুরোধ ট্রান্সফরমার (Transformer)-এ যায়, যা পাঠানোর আগে ডেটা রূপান্তর করে।
একটি Dio ইনস্ট্যান্স BaseOptions অবজেক্টের মাধ্যমে কনফিগার করা হয় যাতে বেস URL, ডিফল্ট হেডার, টাইমআউট, প্রতিক্রিয়ার ধরন (JSON, stream, plain), ক্যোয়ারী প্যারামিটার এবং ডেটা ফরম্যাট থাকে। এই সেটিংস সমস্ত অনুরোধে প্রযোজ্য কিন্তু একটি নির্দিষ্ট অনুরোধে ওভাররাইড করা যেতে পারে। BaseOptions পুরো অ্যাপ্লিকেশনের জন্য একটি একক কনফিগারেশন পয়েন্ট প্রদান করে, যা এন্ডপয়েন্ট পরিবর্তন বা গ্লোবাল হেডার যোগ করা সহজ করে।
Dio-তে প্রতিটি অনুরোধ Response<T> ফেরত দেয়, যেখানে T হল ট্রান্সফরমার প্রক্রিয়াকরণের পরে ডেটার ধরন। ডিফল্টরূপে, Dio স্বয়ংক্রিয়ভাবে JSON প্রতিক্রিয়াগুলিকে Map<String, dynamic>-এ রূপান্তর করে। টাইপকৃত প্রতিক্রিয়ার জন্য, Dio সিরিয়ালাইজেশন প্যাকেজের সাথে ব্যবহার করা হয়: json_serializable, freezed বা built_value। প্রতিক্রিয়াতে data, headers, statusCode, requestOptions এবং অতিরিক্ত ডেটা থাকে।
মৌলিক কনফিগারেশন Dio(BaseOptions)-এর মাধ্যমে তৈরি করা হয়। সমস্ত অনুরোধের জন্য baseUrl, connectTimeout এবং receiveTimeout, content-type এবং accept হেডার, সেইসাথে queryParameters সেট করা যেতে পারে। এই প্যারামিটারগুলি প্রতিটি অনুরোধে প্রযোজ্য, কোড পুনরাবৃত্তি দূর করে এবং নেটওয়ার্ক সেটিংস ব্যবস্থাপনাকে কেন্দ্রীভূত করে।
Dio দুটি সিরিয়ালাইজেশন মোড সমর্থন করে: ডিফল্টরূপে JSON (responseType: ResponseType.json) এবং স্ট্রিমিং (ResponseType.stream)। স্ট্রিম মোডে, Response.data একটি ResponseBody ফেরত দেয় যা অংশে পড়া যায়। এটি বড় পেলোড ফাইলের জন্য সুবিধাজনক যখন সবকিছু মেমরিতে লোড করা অবাঞ্ছিত। প্লেইন মোড স্বয়ংক্রিয় JSON পার্সিং ছাড়াই কাঁচা স্ট্রিং ফেরত দেয়।
ইন্টারসেপ্টর হল অনুরোধ, প্রতিক্রিয়া এবং ত্রুটি আটকানো এবং পরিবর্তন করার জন্য Dio-র মূল পদ্ধতি। এগুলি OkHttp-র Interceptor এবং Ktor-এর প্লাগইন সম্পূর্ণরূপে প্রতিস্থাপন করে, কিন্তু Dart-নির্দিষ্ট API এবং Future-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস সমর্থন সহ। ইন্টারসেপ্টরগুলি গ্লোবাল Dio কনফিগারেশন এবং পৃথক অনুরোধ উভয়েই যোগ করা যেতে পারে।
| ইন্টারসেপ্টর পদ্ধতি | উদ্দেশ্য | ব্যবহারের উদাহরণ |
|---|---|---|
| onRequest | পাঠানোর আগে অনুরোধ পরিবর্তন করুন | অনুমোদন টোকেন যোগ করা |
| onResponse | সফল প্রতিক্রিয়া পরিচালনা করুন | ডেটাকে DTO অবজেক্টে রূপান্তর করা |
| onError | অনুরোধের ত্রুটি পরিচালনা করুন | 503-এ স্বয়ংক্রীয় পুনরায় চেষ্টা |
অন্তর্নির্মিত LogInterceptor প্রতিটি অনুরোধ লগ করে: পদ্ধতি, URL, হেডার, বডি এবং কার্যকর করার সময়। এর দুটি মোড রয়েছে: কমপ্যাক্ট (প্রতি অনুরোধে এক লাইন) এবং সম্পূর্ণ (বডি সহ সম্পূর্ণ তথ্য)। LogInterceptor বিশেষ করে উন্নয়নের সময় দরকারী, তবে শর্তসাপেক্ষ import বা গ্লোবাল ফ্ল্যাগের মাধ্যমে রিলিজ বিল্ডে এটি নিষ্ক্রিয় করার পরামর্শ দেওয়া হয়।
কাস্টম ইন্টারসেপ্টর InterceptorsWrapper ক্লাসের মাধ্যমে তৈরি করা হয়। একটি, দুটি বা তিনটি পদ্ধতি (onRequest, onResponse, onError) ওভাররাইড করা যেতে পারে। Dio ইন্টারসেপ্টরগুলিকে তাদের ইন্টারসেপ্টর তালিকায় যোগ করার ক্রমে কঠোরভাবে কার্যকর করে। যদি কোনো ইন্টারসেপ্টর handler.next() কল না করে, তাহলে চেইন বাধাগ্রস্ত হয় এবং প্রতিক্রিয়া বা ত্রুটি অ্যাপ্লিকেশনে পৌঁছায় না।
Dio-তে প্রমাণীকরণের জন্য, একটি ইন্টারসেপ্টর ব্যবহার করা হয় যা Authorization হেডারে Bearer টোকেন যোগ করে। যদি সার্ভার 401 ফেরত দেয়, তাহলে onError-এ ইন্টারসেপ্টর একটি রিফ্রেশ অনুরোধের মাধ্যমে টোকেন পুনর্নবীকরণের চেষ্টা করে এবং নতুন টোকেন সহ মূল অনুরোধটি পুনরায় করে। এই প্যাটার্নটিকে টোকেন রিফ্রেশ ইন্টারসেপ্টর বলা হয় এবং response?.statusCode == 401 চেক করে DioException-এর মাধ্যমে বাস্তবায়িত হয়।
Dio পুনরায় চেষ্টার যুক্তি-র জন্য dio_smart_retry প্যাকেজ বা কাস্টম RetryInterceptor-এর মাধ্যমে অন্তর্নির্মিত সমর্থন প্রদান করে। মোবাইল অ্যাপ্লিকেশনের জন্য পুনরায় চেষ্টা গুরুত্বপূর্ণ: যখন সংযোগ 2-3 সেকেন্ডের জন্য হারিয়ে যায়, Dio connectionTimeout বা connectionError টাইপ সহ DioException নিক্ষেপ করে। RetryInterceptor এই ব্যতিক্রম ধরে এবং এক্সপোনেনশিয়াল ব্যাকঅফ (1s, 2s, 4s) সহ 3 বার পর্যন্ত অনুরোধ পুনরায় চেষ্টা করে, অস্থির নেটওয়ার্ক অবস্থায় অ্যাপ্লিকেশন নির্ভরযোগ্যতা উন্নত করে।
আসুন Dio-র মাধ্যমে মৌলিক GET অনুরোধ দেখি। BaseOptions সহ একটি ইনস্ট্যান্স তৈরি করা হয়, বেস URL এবং টাইমআউট সেট করা হয়। অনুরোধটি get() পদ্ধতির মাধ্যমে কার্যকর করা হয়, যা Map ফরম্যাটে ডেটা সহ Response ফেরত দেয়।
final dio = Dio(BaseOptions(
baseUrl: 'https://api.github.com',
connectTimeout: Duration(seconds: 15),
receiveTimeout: Duration(seconds: 15),
headers: {
'Accept': 'application/vnd.github.v3+json',
},
))
final response = await dio.get('/users/octocat')
print(response.data['লগইন'])
JSON বডি সহ POST অনুরোধ-এর জন্য, একটি Map অবজেক্ট বা কাস্টম DTO পাস করা হয়। Dio স্বয়ংক্রিয়ভাবে jsonEncode-এর মাধ্যমে Map-কে JSON-এ সিরিয়ালাইজ করে। টাইপকৃত DTO-র জন্য, queryParameters অপশন, data ফিল্ড বা কাস্টম Transformer ব্যবহার করা হয়।
final data = {
'name': 'my-project',
'description': 'Created via Dio',
'private': false,
}
final response = await dio.post(
'/user/repos',
data: data,
options: Options(
contentType: ContentType.json.value,
),
)
print(response.data['আইডি'])
একটি কাস্টম ইন্টারসেপ্টর প্রতিটি অনুরোধে Bearer টোকেন যোগ করে। onRequest পদ্ধতি পাঠানোর আগে সক্রিয় হয়, হেডার পরিবর্তন করে। 401 প্রতিক্রিয়ায়, ইন্টারসেপ্টর টোকেন রিফ্রেশ করতে পারে এবং dio.fetch(requestOptions) পদ্ধতির মাধ্যমে অনুরোধ পুনরায় করতে পারে।
class AuthInterceptor extends InterceptorsWrapper {
final String token
AuthInterceptor(this.token)
@override
void onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) {
options.headers['Authorization'] = 'Bearer $token'
handler.next(options)
}
}
dio.interceptors.add(AuthInterceptor('ghp_abc123'))
Dio সহজ করে FormData-র মাধ্যমে ফাইল আপলোড। ফাইল পাঠানোর জন্য, File, Bytes বা AssetBundle থেকে MultipartFile তৈরি করা হয়। FormData স্বয়ংক্রিয়ভাবে সঠিক সীমানা এবং এনকোডিং সহ multipart/form-data হেডার সেট করে। Dio onSendProgress-এর মাধ্যমে আপলোড অগ্রগতি সমর্থন করে।
ফাইল ডাউনলোডের জন্য, download() পদ্ধতি ব্যবহার করা হয়, যা ডেটা স্ট্রিম সরাসরি ফাইলে সংরক্ষণ করে। Dio Range হেডারের মাধ্যমে বাধাগ্রস্ত ডাউনলোড পুনরায় শুরু করার সমর্থন করে, যা বিশেষ করে বড় ফাইলের জন্য দরকারী। ডাউনলোড অগ্রগতি onReceiveProgress-এর মাধ্যমে ট্র্যাক করা হয়, যা UI-তে অগ্রগতি বার প্রদর্শনের অনুমতি দেয়।
final formData = FormData.fromMap({
'file': await MultipartFile.fromFile(
'/path/to/photo.jpg',
filename: 'photo.jpg',
),
'description': 'Profile photo',
})
await dio.post(
'/upload',
data: formData,
onSendProgress: (sent, total) {
final progress = sent / total * 100
print('আপলোড: $progress%')
},
)
// ফাইল ডাউনলোড
await dio.download(
'https://example.com/file.zip',
'/storage/emulated/0/Download/file.zip',
onReceiveProgress: (received, total) {
print('ডাউনলোড: ${received / total * 100}%')
},
)
ভুল ত্রুটি পরিচালনা সবচেয়ে সাধারণ সমস্যা। Dio যেকোনো সমস্যার জন্য DioException (পূর্বে DioError) নিক্ষেপ করে: নেটওয়ার্ক অনুপলব্ধতা, টাইমআউট, HTTP ত্রুটি 4xx/5xx। অনেক ডেভেলপার শুধুমাত্র জেনেরিক Exception ধরে, ত্রুটির ধরন এবং এটি বিশেষভাবে পরিচালনা করার ক্ষমতা সম্পর্কে তথ্য হারিয়ে ফেলে। ব্যর্থতার কারণ নির্ধারণ করতে DioException.type ব্যবহার করুন।
CancelToken উপেক্ষা করা অনুরোধ লিকের দিকে নিয়ে যায়। যদি কোনো ব্যবহারকারী স্ক্রিন ছেড়ে দেয় যখন একটি অনুরোধ এখনও চলছে, Dio সম্পদ নষ্ট করে এবং ধ্বংসকৃত State আপডেট করার চেষ্টা করতে পারে। সর্বদা প্রতিটি অনুরোধের জন্য একটি CancelToken তৈরি করুন এবং এটি dispose()-এ বাতিল করুন। CancelToken cancel টাইপ সহ DioException তৈরি করে, যা সঠিকভাবে পরিচালনা করা আবশ্যক।
অস্থায়ী ব্যর্থতার জন্য পুনরায় চেষ্টার যুক্তির অভাব। মোবাইল ডিভাইসে, নেটওয়ার্ক প্রায়ই অল্প সময়ের জন্য অনুপলব্ধ থাকে। টাইমআউট বা 503/502 প্রতিক্রিয়ায় স্বয়ংক্রিয় অনুরোধ পুনরায় চেষ্টা সহ একটি ইন্টারসেপ্টর বাস্তবায়ন করুন। dio_smart_retry প্যাকেজ থেকে RetryInterceptor ব্যবহার করুন বা প্রচেষ্টার মধ্যে এক্সপোনেনশিয়াল ব্যাকঅফ সহ একটি কাস্টম ইন্টারসেপ্টর লিখুন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Dio ইন্টারসেপ্টর, গ্লোবাল BaseOptions কনফিগারেশন, FormData, আপলোড অগ্রগতি এবং CancelToken প্রদান করে। Dart টিমের http প্যাকেজ ন্যূনতম, ইন্টারসেপ্টর বা গ্লোবাল কনফিগারেশন ছাড়া। Dio বড় প্রকল্পে ব্যবহার করা হয়, যখন http সাধারণ স্ক্রিপ্টের জন্য ব্যবহার করা হয়।
ডিফল্টরূপে, Dio jsonDecode ব্যবহার করে JSON-কে Map-এ রূপান্তর করে। টাইপকৃত সিরিয়ালাইজেশনের জন্য, json_serializable বা freezed প্যাকেজ ব্যবহার করুন। একটি কাস্টম ইন্টারসেপ্টর তৈরি করুন যা onResponse-এ fromJson()-এর মাধ্যমে response.data-কে DTO-তে রূপান্তর করে।
একটি CancelToken তৈরি করুন এবং এটি অনুরোধ অপশনে পাস করুন। token.cancel() কল করলে অনুরোধ বাধাগ্রস্ত হয় এবং cancel টাইপ সহ DioException নিক্ষেপ করে। CancelToken একসাথে একাধিক অনুরোধ বাতিল করার সমর্থন করে, যা স্ক্রিন ছাড়ার সময় সমস্ত অনুরোধ বাতিল করার জন্য সুবিধাজনক।
হ্যাঁ, Dio সব ছয়টি Flutter প্ল্যাটফর্মে কাজ করে: Android, iOS, Web, macOS, Windows এবং Linux। প্রতিটি প্ল্যাটফর্ম একটি অভিযোজিত HTTP ক্লায়েন্ট ব্যবহার করে: DartNativeAdapter (নেটিভ প্ল্যাটফর্ম) এবং BrowserAdapter (Web)। সব প্ল্যাটফর্মের জন্য ইউনিফাইড API Flutter প্রকল্পে Dio-র একটি মূল সুবিধা।
Dio স্বয়ংক্রিয়ভাবে কুকি পরিচালনা করে না। কুকি সমর্থনের জন্য, dio_cookie_manager প্যাকেজ cookie_jar-এর সাথে ব্যবহার করুন। CookieManager Set-Cookie এবং Cookie হেডার আটকায় এবং একই ডোমেনে পরবর্তী অনুরোধে স্বয়ংক্রিয় পাঠানোর জন্য PersistCookieJar-এ কুকি সংরক্ষণ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন