ویرگول
ورودثبت نام
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالیمن عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
خواندن ۴ دقیقه·۷ ماه پیش

کار با Retrofit در فلاتر

کار با Retrofit در فلاتر
کار با Retrofit در فلاتر

اصلا Retrofit چی هست؟

رتروفت یه کتابخونه ایه که به ما کمک میکنه ارتباط با شبکه که از نوع پروتکل HTTP هست یا به عبارت بهتر ارتباط با اند پوینت های rest رو برای ما آسون تر و تمیز تر میکنه

روش نصب رتروفت در فلاتر

برای اینکه از رتروفت در فلاتر استفاده کنیم نیازه که چند پکیج رو به همراه اون نصب داشته باشیم پس برای نصب هر کدوم به روش زیر عمل میکنیم

flutter pub add retrofit logger json_annotation dev:retrofit_generator dev:build_runner dev:json_serializable
  • یه نکته اینکه رتروفت از دیو برای ارسال درخواست ها استفاده میکنه اگر دیدی بهت ارور داد dio رو هم نصب کن

خب اولین پکیج که خود رتروفت هست و دومی هم لاگر برای لاگ زدن رتروفت در صورت بروز ارور و اینا و سومی که جیسون انوتیشن برای انوتیشن گذاری استفاده میشه (همون که اولش اتساین(@) داره)

رتروفت جنریتور که توی دیپندنسی دولوپ هست برای تولید کد های رتروفت و بیلد راننر هم برای اجرای دستور بیلد و همچنین جیسون سریالازبل برای سریالایز کردن مدل های ما هست

تعریف و تولید کد ای پی ای های ما

برای تعریف ای پی ای هامون مثل مثال زیر عمل میکنیم

import 'package:dio/dio.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:retrofit/retrofit.dart'; part 'example.g.dart'; @RestApi(baseUrl: 'https://MyApi.com/v1') abstract class RestClient { factory RestClient(Dio dio, {String? baseUrl}) = _RestClient; @GET('/tasks') Future<List<Task>> getTasks(); }
  • این نکته رو بگم که اگر فقط این کد رو کپی پیست کنی احتمالا به ارور هایی مثل تعریف نشده بخورید و این به این دلیل هست که هنوز کد اصلی ما تولید نشده

ما فرض می کنیم که فایل ما به نام example.dart هست بعد از ایمپورت های اصلی باید به دارت(یا همون بیلد راننر) بگیم که آقا این فایل من که example.dart هست قراره بخشی از اون رو توی فایل example.g.dart جنریت بشه پس کد 'part 'example.g.dart رو اضافه میکنیم

در مرحله بعد یه انوتیشن داریم تحت RestApi@ که این انوتیشن بهش پارامتر بیس یو آرل میدیم که این پایه url ما هست برای مثال ما آدرس های زیر رو داریم

https://MyApi.com/v1/tasks/

https://MyApi.com/v1/task/

https://MyApi.com/v1/delete/task/{id}/

خب این سه تا یو آر ال بیس ما میشه https://MyApi.com/v1 و در ادامه تغییر میکنه

پس توی انوتیشن RestApi@ آدرس پایه مون رو میدیم

یک ابسترکت کلاس می نویسیم به همراه اسمی که میخوایم که اسمش گذاشتیم RestClient خب بعد توی یک فکتوری بهش دیو و آدرس پایه رو تعریف کردیم و مساوی آندرلاین اسم کلاس

خب حالا وقت تعریف کردن متود هامون رسیده که حالات مختلف داره برای مثال برای درخواست GET از آدرس /https://MyApi.com/v1/tasks چون آدرس پایه رو بهش دادیم کافیه انتهایی که میخوایم رو بهش بدیم که میشه
GET('/tasks/')@
حالا کلاسمون که قراره چی بر بگردونه از نوع فیوچر مینویسیم که اینجا قراره لیستی از مدل Task بر بگردونه

  • این مدل ما حتما باید جی سون سریالایزبل باشه یا متود fromJson تعریف شده باشه برای مدل ما

خب تعریف انجام شد بریم تا کد رو جنریت کنیم

  • چون رتروفت معمولا یه فرمت خاص داره برای تعریف کلاس بهتره برای اینکه سریع تر بنویسی و کد رو کپی پیست نکنی از Mason برای تولید کد تکراری استفاده کنی

برای جنریت کردن کد رتروفت کافیه دستور زیر رو توی ترمینال پروژه اجرا کنیم

dart run build_runner build

و بعد از پایان کار تمومه میتونی درخواست رو بزنی

یکمی عمیق تر توی رتروفت

خب ما که فقط نیاز به یه درخواست ساده GET تنها نداریم ممکنه درخواست ما دیتا داشته باشه و یا حتی Header و شایدم داینامیک باشه لینک ما یعنی یه آیدی بخوایم وسط لینک بذاریم و بعد درخواست رو بدیم

اضافه کردن دیتا به درخواست یا همون body کافیه که اونجا که فیوچر رو تعریف میکنیم انوتیشن Body ضافه کنیم که میشه به شکل زیر

@POST(&quot/task/&quot) Future<Task> postTask(@Body() Map<String, dynamic> data);

حالا اگه بخوایم heder هم اضافه کنیم هم مثل بادی عمل میکنیم و انوتیشن Header میذاریم و هدری که میخوایم ارسال بشه مثلا میخوام Content-Type بفرستم

@POST(&quot/task/&quot) Future<Task> postTask(@Header('Content-Type') String contentType, @Body() Map<String, dynamic> data);


اگر دیدی نمیشه بجای ایمپورت dio اینو ایمپورت کن

import 'package:dio/dio.dart' hide Headers;

برای اینکه بتونیم داینامیک لینک داشته باشیم هم داینامیک لینک رو به شکل زیر تعریف میکنیم

@DELETE('delete/task/{id}/') Future<void> deleteTask(@Path('id') String taskId);

در اینجا درخواست دیلیت با آیدی که توی آدرس تعریف کردیم میره

خب حالا چطوری از این رتروفت استفاده کنیم

برای استفاده از رتروفت کافیه کلاس آبسترکتی که تعریف کردیم رو بسازیم و دیو رو بهش پاس بدیم و متود هارو صدا بزنیم

final dio = Dio(); final myRestClinet = RestClient(dio); try{ final tasks = await myRestClient.getTasks(); }on DioException catch(e){ // TODO: Catch error }
  • توجه کنید که اگر پاسخ متود getTasks ساکسس باشد یعنی 2xx باشد بدنه try اجرا میشود ولی اگر ساکسس نباشد یعنی 400 به بالا اون موقع خطا از نوع DioException میده و هندلش باید کرد


امیدوارم این پست براتون مفید شده باشه و از استفاده از رتروفت لذت ببرید

منابع من برای این پست

pub.dev

عدنان کمالی | Adnan Kamali

فلاتر
۰
۰
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
من عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
شاید از این پست‌ها خوشتان بیاید