A Gallant Gentleman
We Lost The Sea
هیچکس نمیفهمه کِی دقیقاً سقوط کردی.
چون سقوط، صدا نداره.
آرام میاد، آرام میمونه، و اگر بگذره… ردّش رو فقط خودت میفهمی.
چند هفته گذشته، زمان انگار ایستاد…
نه برای استراحت، برای عبور از چیزی که اسم نداره.
برای جمع کردن تکههایی از خودم که جا مونده بودن.
حالا دوباره برگشتم.
بدون هیاهو، بدون ادعا.
اما با نگاهی تازه و قلبی سنگینتر — اما بیدارتر.
نه برای اینکه دیده بشم.
برای اینکه خودم رو ببینم.
دوباره مینویسم،
دوباره آموزش میدم،
دوباره کُد میزنم،
نه از سر عادت،
از سر ایمان به مسیری که انتخابش کردم.
اینجا، وسط این گرد و خاک…
من هنوزم ایستادم.
برای خودم.
برای شما.
برای چیزی که هنوز زندهست
چون سقوط، صدا نداره.
آرام میاد، آرام میمونه، و اگر بگذره… ردّش رو فقط خودت میفهمی.
چند هفته گذشته، زمان انگار ایستاد…
نه برای استراحت، برای عبور از چیزی که اسم نداره.
برای جمع کردن تکههایی از خودم که جا مونده بودن.
حالا دوباره برگشتم.
بدون هیاهو، بدون ادعا.
اما با نگاهی تازه و قلبی سنگینتر — اما بیدارتر.
نه برای اینکه دیده بشم.
برای اینکه خودم رو ببینم.
دوباره مینویسم،
دوباره آموزش میدم،
دوباره کُد میزنم،
نه از سر عادت،
از سر ایمان به مسیری که انتخابش کردم.
اینجا، وسط این گرد و خاک…
من هنوزم ایستادم.
برای خودم.
برای شما.
برای چیزی که هنوز زندهست
❤17❤🔥2👍2
سلام مجدد 🌷
یه پست کاربردی، معرفی کامند فلاتری
چرا یه پکیج خاص تو پروژهت هست؟
یا کدوم نسخه از یه پکیج واقعاً استفاده شده؟
یا لازم بشه تداخل پکیجها رو چک کنی؟
اینجاست که
نحوه استفاده:
این دستور درخت کامل وابستگیها رو نشون میده. یعنی پکیجهایی که پروژه بهشون وابستهست و پکیجهایی که اونا هم بهشون وابستهن.
### 📚 حالت خلاصه و فیلتر:
فقط پکیجهایی که به
یا فقط پکیجهای مستقیم:
کاربردها:
پیدا کردن علت وجود پکیجهایی که مستقیم نصب نکردی
رفع تداخل یا دوبار نصب یه پکیج با نسخههای مختلف
دیباگ مشکلات پکیجها در CI یا روی سیستمهای مختلف
#Flutter #PubDeps #FlutterTips #DebugFlutter
یه پست کاربردی، معرفی کامند فلاتری
چرا یه پکیج خاص تو پروژهت هست؟
یا کدوم نسخه از یه پکیج واقعاً استفاده شده؟
یا لازم بشه تداخل پکیجها رو چک کنی؟
اینجاست که
flutter pub deps کمک میکنه! نحوه استفاده:
flutter pub deps
این دستور درخت کامل وابستگیها رو نشون میده. یعنی پکیجهایی که پروژه بهشون وابستهست و پکیجهایی که اونا هم بهشون وابستهن.
### 📚 حالت خلاصه و فیلتر:
فقط پکیجهایی که به
http وابستهن:flutter pub deps --filter=http
یا فقط پکیجهای مستقیم:
flutter pub deps --style=compact
کاربردها:
پیدا کردن علت وجود پکیجهایی که مستقیم نصب نکردی
رفع تداخل یا دوبار نصب یه پکیج با نسخههای مختلف
دیباگ مشکلات پکیجها در CI یا روی سیستمهای مختلف
#Flutter #PubDeps #FlutterTips #DebugFlutter
❤10👍3🥰1
موقعیت شغلی #فلاتر
سعی کنید اینتر ویو ها و مقعیت های مختلف رو شرکت کنید، یکی از منابع اصلی و مهم کسب تجربه هستند.
سعی کنید اینتر ویو ها و مقعیت های مختلف رو شرکت کنید، یکی از منابع اصلی و مهم کسب تجربه هستند.
👍5❤3
با یه دستور ساده میتونی ببینی کدوم پکیج یا وابستگی ها آپدیت شدن، چقدر عقب افتادن و آیا آپدیت امنی دارن یا نه!
flutter pub outdated
* **Current → نسخهای که الان نصب کردی
* Upgradable → نسخهای که با تغییر
* Resolvable → جدیدترین نسخهای که بدون تداخل قابل استفادهست
* Latest → جدیدترین نسخه ممکن (حتی اگه با پروژه فعلی تداخل داشته باشه)
### 🔧 بروزرسانی سریع:
یا با دقتتر (مثلاً فقط یه پکیج):
🎯 کاربردها:
✅ فهمیدن اینکه کدوم پکیج قدیمیه
✅ بررسی امنیت و باگفیکسها
✅ تصمیمگیری برای ارتقای safe یا major
✅ آماده شدن برای migration
#flutter
flutter pub outdated
* **Current → نسخهای که الان نصب کردی
* Upgradable → نسخهای که با تغییر
pubspec.yaml میتونی بگیری* Resolvable → جدیدترین نسخهای که بدون تداخل قابل استفادهست
* Latest → جدیدترین نسخه ممکن (حتی اگه با پروژه فعلی تداخل داشته باشه)
### 🔧 بروزرسانی سریع:
flutter pub upgrade
یا با دقتتر (مثلاً فقط یه پکیج):
flutter pub upgrade http
🎯 کاربردها:
✅ فهمیدن اینکه کدوم پکیج قدیمیه
✅ بررسی امنیت و باگفیکسها
✅ تصمیمگیری برای ارتقای safe یا major
✅ آماده شدن برای migration
#flutter
❤9👍7
sasan safari
GIF
برای فلاتر دولوپر ها
🎉 پکیج flutter_searchify حالا روی pub.dev در دسترسه.
این پکیج رو برای یه مشکل ساده ولی پرتکرار ساختم
اضافه کردن یک فیلد جستجوی کاملاً قابل شخصیسازی با نتایج لحظهای (Realtime Suggestions) از منابع مختلف مخصوصاً برای فرمهای پیچیده یا وابسته به دادههای داینامیک.
💡 چه مشکلی رو حل میکنه؟
فرض کن:
میخوای لیستی از شهرها یا محصولات رو از سرور بگیری وقتی کاربر داره تایپ میکنه
حجم دیتا زیاده و نمیتونی همهی آیتمها رو از قبل لود کنی
یا حتی یه فیلد وابستهست (مثلاً انتخاب شهر بعد از انتخاب کشور)
تو این موارد، یه سرچبار که با هر حرف کاربر، از سرور کوئری بفرسته و نتایج رو تمیز نمایش بده، دقیقاً چیزیه که نیاز دارید، مثل تکست فیلد های دیگه تو فرم قرار میگیره و نتایج به صورت اورلی و واکنشگرا نمایش داده میشن.
🧩 ویژگیهای اصلی FlutterSearchify:
دریافت لیست آیتمها با هر بار تایپ با تابع
( Future<List<T>>)
بدون وابستگی به نوع آیتم: T میتونه هر چیزی باشه (مدل شهر، کاربر، محصول یا حتی استرینگ ساده)
نتایج با Overlay مستقل نمایش داده میشن , نه Dropdown پیشفرض
ظاهر و استایل کاملاً قابل شخصیسازی:
از Border و رنگ گرفته تا فاصله آیتمها و Widget هر آیتم
حتی متدهای اصلی مثل onSearch, onTap, itemBuilder, suffixIcon, focusNode, directionality, و ... هم قابل کنترلن
🎯 کاربردهای رایج:
فرم ثبتنام یا پروفایل با فیلد انتخاب شهر (از روی API)
انتخاب کالا از دیتابیس با جستجوی تدریجی
سرچ نام کاربرها یا آیتمهای داخل CMS
فرمهای مدیریتی با UX مدرن و بدون لیست کشویی سنتی
📦 pub.dev:
https://pub.dev/packages/flutter_searchify
💻 GitHub (با مثال اجرایی و تصویر):
https://github.com/sasansafari/flutter_searchify
خوشحال میشم ببینم تو پروژههاتون ازش استفاده میکنید.
اگر سؤالی داشتید یا ایدهای برای توسعه بیشتر، در DMs یا Issues در خدمتم.
#flutter #dart #opensource #uiux #flutterdev #فلاتر
🎉 پکیج flutter_searchify حالا روی pub.dev در دسترسه.
این پکیج رو برای یه مشکل ساده ولی پرتکرار ساختم
اضافه کردن یک فیلد جستجوی کاملاً قابل شخصیسازی با نتایج لحظهای (Realtime Suggestions) از منابع مختلف مخصوصاً برای فرمهای پیچیده یا وابسته به دادههای داینامیک.
💡 چه مشکلی رو حل میکنه؟
فرض کن:
میخوای لیستی از شهرها یا محصولات رو از سرور بگیری وقتی کاربر داره تایپ میکنه
حجم دیتا زیاده و نمیتونی همهی آیتمها رو از قبل لود کنی
یا حتی یه فیلد وابستهست (مثلاً انتخاب شهر بعد از انتخاب کشور)
تو این موارد، یه سرچبار که با هر حرف کاربر، از سرور کوئری بفرسته و نتایج رو تمیز نمایش بده، دقیقاً چیزیه که نیاز دارید، مثل تکست فیلد های دیگه تو فرم قرار میگیره و نتایج به صورت اورلی و واکنشگرا نمایش داده میشن.
🧩 ویژگیهای اصلی FlutterSearchify:
دریافت لیست آیتمها با هر بار تایپ با تابع
( Future<List<T>>)
بدون وابستگی به نوع آیتم: T میتونه هر چیزی باشه (مدل شهر، کاربر، محصول یا حتی استرینگ ساده)
نتایج با Overlay مستقل نمایش داده میشن , نه Dropdown پیشفرض
ظاهر و استایل کاملاً قابل شخصیسازی:
از Border و رنگ گرفته تا فاصله آیتمها و Widget هر آیتم
حتی متدهای اصلی مثل onSearch, onTap, itemBuilder, suffixIcon, focusNode, directionality, و ... هم قابل کنترلن
🎯 کاربردهای رایج:
فرم ثبتنام یا پروفایل با فیلد انتخاب شهر (از روی API)
انتخاب کالا از دیتابیس با جستجوی تدریجی
سرچ نام کاربرها یا آیتمهای داخل CMS
فرمهای مدیریتی با UX مدرن و بدون لیست کشویی سنتی
📦 pub.dev:
https://pub.dev/packages/flutter_searchify
💻 GitHub (با مثال اجرایی و تصویر):
https://github.com/sasansafari/flutter_searchify
خوشحال میشم ببینم تو پروژههاتون ازش استفاده میکنید.
اگر سؤالی داشتید یا ایدهای برای توسعه بیشتر، در DMs یا Issues در خدمتم.
#flutter #dart #opensource #uiux #flutterdev #فلاتر
Dart packages
flutter_searchify | Flutter package
A reusable autocomplete search widget for Flutter.
❤23👍15👏3🔥2
شاید خبر خوبی باشه براتون..
من هروقت از پشت سیستم بلند میشم و استراحت میکنم، چند دقیقه ای لینکدین میچرخم
چیزی که این روزا دارم خیلی میبینم اینه که موقعیت شغلی فلاتر، بخصوص تیم های خارجی به شدت زیاد شدن و رشد عجیبی دارن!! همچنین داخل ایران هم تقاضا بیشتر از قبل شده
من هروقت از پشت سیستم بلند میشم و استراحت میکنم، چند دقیقه ای لینکدین میچرخم
چیزی که این روزا دارم خیلی میبینم اینه که موقعیت شغلی فلاتر، بخصوص تیم های خارجی به شدت زیاد شدن و رشد عجیبی دارن!! همچنین داخل ایران هم تقاضا بیشتر از قبل شده
❤33👍9
یکی از دوستان در جواب من گفت آگهی استخدام فلاتر نمیبینه!
امرور من ۲ بار، هر بار فقط ۵ دقیقه لینکدین اسکرول کردم چندتا تا اگهی فلاتر دیدم , بعضیاشو براتون گذاشتم :)
امرور من ۲ بار، هر بار فقط ۵ دقیقه لینکدین اسکرول کردم چندتا تا اگهی فلاتر دیدم , بعضیاشو براتون گذاشتم :)
❤12
چه خارجی چه ایرانی، مصاحبه برید و نترسید هرچی بشه یه چیزی از توش در میاد که یاد بگیرید 🌷
فردا مطلب فنی جدید میذارم براتون
فردا مطلب فنی جدید میذارم براتون
❤13
از این به بعد یک سری سوالات تکنیکال میپرسم، که وادار بشید به مطالعه و بعدش در موردش صحبت میکنیم در کامنت ها
سوال اول:
فرض کن یه اپلیکیشن Flutter با Navigation پیچیده و چندین صفحه داری که بینشون state باید share بشه. چه راهکارهایی برای مدیریت این shared state پیشنهاد میکنی؟
سوال اول:
فرض کن یه اپلیکیشن Flutter با Navigation پیچیده و چندین صفحه داری که بینشون state باید share بشه. چه راهکارهایی برای مدیریت این shared state پیشنهاد میکنی؟
🔥13
sasan safari
از این به بعد یک سری سوالات تکنیکال میپرسم، که وادار بشید به مطالعه و بعدش در موردش صحبت میکنیم در کامنت ها سوال اول: فرض کن یه اپلیکیشن Flutter با Navigation پیچیده و چندین صفحه داری که بینشون state باید share بشه. چه راهکارهایی برای مدیریت این shared…
تکمیلی :)
بسته به اینکه از چه ابزار state management و چه معماری استفاده کنیم، نحوهی مدیریت shared state میتونه متفاوت باشه.
ولی یه الگوی کلی بین همهی این ابزارها مشترکه: اینکه هر صفحه یک controller (Bloc، ViewModel، GetxController، یا ...) مخصوص خودش داشته باشه، و در کنار اون، یک یا چند controller مرکزی برای مدیریت state مشترک مثل تنظیمات، اطلاعات کاربر یا وضعیت سراسری اپلیکیشن تعریف بشه.
در واقع، این تفکیک بین local state و shared state، اساس چیزیه که بهش میگیم state management حالا با هر ابزاری که باشه
بسته به اینکه از چه ابزار state management و چه معماری استفاده کنیم، نحوهی مدیریت shared state میتونه متفاوت باشه.
ولی یه الگوی کلی بین همهی این ابزارها مشترکه: اینکه هر صفحه یک controller (Bloc، ViewModel، GetxController، یا ...) مخصوص خودش داشته باشه، و در کنار اون، یک یا چند controller مرکزی برای مدیریت state مشترک مثل تنظیمات، اطلاعات کاربر یا وضعیت سراسری اپلیکیشن تعریف بشه.
در واقع، این تفکیک بین local state و shared state، اساس چیزیه که بهش میگیم state management حالا با هر ابزاری که باشه
👍18❤1
سوال دوم:
فرض کنید در حال توسعهی یه اپلیکیشن Flutter هستید که باید به صورت آفلاین هم کار کنه؛ یعنی کاربر بتونه بدون اینترنت داده وارد کنه و بعد که دوباره آنلاین شد، اطلاعات با سرور sync بشن.
چه راهکاری برای مدیریت این حالت آفلاین/آنلاین و همگامسازی دادهها پیشنهاد میکنید؟
و چه نقشهایی باید بین لایههای مختلف اپ (UI، domain، data) تقسیم بشن تا این قابلیت بهدرستی کار کنه؟
فرض کنید در حال توسعهی یه اپلیکیشن Flutter هستید که باید به صورت آفلاین هم کار کنه؛ یعنی کاربر بتونه بدون اینترنت داده وارد کنه و بعد که دوباره آنلاین شد، اطلاعات با سرور sync بشن.
چه راهکاری برای مدیریت این حالت آفلاین/آنلاین و همگامسازی دادهها پیشنهاد میکنید؟
و چه نقشهایی باید بین لایههای مختلف اپ (UI، domain، data) تقسیم بشن تا این قابلیت بهدرستی کار کنه؟
👍12❤2🍾1
sasan safari pinned «برای فلاتر دولوپر ها 🎉 پکیج flutter_searchify حالا روی pub.dev در دسترسه. این پکیج رو برای یه مشکل ساده ولی پرتکرار ساختم اضافه کردن یک فیلد جستجوی کاملاً قابل شخصیسازی با نتایج لحظهای (Realtime Suggestions) از منابع مختلف مخصوصاً برای فرمهای پیچیده…»
sasan safari
سوال دوم: فرض کنید در حال توسعهی یه اپلیکیشن Flutter هستید که باید به صورت آفلاین هم کار کنه؛ یعنی کاربر بتونه بدون اینترنت داده وارد کنه و بعد که دوباره آنلاین شد، اطلاعات با سرور sync بشن. چه راهکاری برای مدیریت این حالت آفلاین/آنلاین و همگامسازی دادهها…
#همگام_سازی در فلاتر
اول از همه من یک معماری ساختاری انتخاب میکنم که برای چنین اپی قطعا Clean بهترین هست و البته آرکیتکچر پترنِ CQRS که اینم جدا توضیح میدم.
توی لایه UI فقط نمایش و تعامل داریم.
لایهی Application کار مدیریت وضعیت و فراخوانی use caseها رو انجام میده.
لایهی Domain شامل منطق اصلی اپه، مثل عملیات ثبت، و همینطور موتور همگامسازی.
و در نهایت لایه Data که با دیتابیس لوکال و سرور در ارتباطه.
حالا برای اینکه حالت آفلاین/آنلاین درست مدیریت بشه، اول باید کاری کنیم که همهی دادهها اول به صورت لوکال ذخیره بشن؛ چه اینترنت باشه چه نباشه. یعنی مثلا از دیتابیسهایی مثل Drift یا Hive استفاده میکنیم و اطلاعاتو اونجا نگه میداریم.
نکتهی مهم اینه که وقتی کاربر دادهای رو وارد میکنه، باید اون عملیات (مثل افزودن، ویرایش، یا حذف) به شکل یه "عملیات همگامسازی" ثبت بشه. یه چیزی شبیه به صف عملیات، که مثلا بگه: این یادداشت قراره ساخته بشه، این یکی ویرایش بشه، اون یکی حذف بشه... و همینطور(یه جواریی یه سری فلگ داریم)
هر کدوم از این عملیات یه state دارن: در حال انتظار، انجام شده، یا ناموفق. بعد یه چیزی به اسم Sync Engine
(اینو پیامای بعدی توضیح میدم) داریم که وقتی اینترنت وصل شد، میاد یکییکی این عملیاتها رو اجرا میکنه و اونا رو با سرور هماهنگ میکنه.
اینجا باید حواسمون به چند تا چیز باشه:
اگه عملیات موفق بود، علامت میزنیم که همگام شده.
اگه شکست خورد، اون عملیات توی صف میمونه تا بعداً دوباره امتحانش کنیم.
ممکنه کانفلیکت هم پیش بیاد. مثلاً کاربر آفلاین یه چیزی رو تغییر داده، همزمان سرور هم اون داده رو عوض کرده. تو این حالت یا از روش سادهی "آخرین تغییر برنده است" استفاده میکنیم، یا یه استراتژی ترکیبی داریم، یا حتی به کاربر نشون میدیم که یه تضاد وجود داره.
در نهایت نقش هر لایه توی اپ اینجوری تقسیم میشه:
لایه UI فقط داده رو نمایش میده و وضعیت sync رو نشون میده.
لایه Application عملیات رو مدیریت میکنه و موتور sync رو راه میاندازه.
لایه Domain منطق اصلی رو داره، مثل تعریف موجودیتها، عملیاتها، و اینکه sync چجوری انجام بشه
لایه Data چ مسئول ارتباط با دیتابیس لوکال و API سروره.
علاوه بر اینا، باید سیستم رو طوری طراحی کنیم که تغییرات شبکه رو تشخیص بده؛ مثلاً وقتی دوباره آنلاین شدیم، عملیات sync خودکار شروع بشه. برای اینکار از پکیجهایی مثل connectivity_plus استفاده میکنیم.
اگه بخوام خلاصه کنم:
همیشه اول داده رو لوکال ذخیره کن، حتی وقتی آنلاینیم.
تغییرات رو توی یه صف نگه دار.
با یه موتور sync این صف رو مدیریت کن.
اینجوری، یه اپ مقاوم میسازیم که توی هر شرایطی، حتی بدون اینترنت هم درست کار میکنه و هیچ دادهای از دست نمیره
@sasansafari_dev1400
اول از همه من یک معماری ساختاری انتخاب میکنم که برای چنین اپی قطعا Clean بهترین هست و البته آرکیتکچر پترنِ CQRS که اینم جدا توضیح میدم.
توی لایه UI فقط نمایش و تعامل داریم.
لایهی Application کار مدیریت وضعیت و فراخوانی use caseها رو انجام میده.
لایهی Domain شامل منطق اصلی اپه، مثل عملیات ثبت، و همینطور موتور همگامسازی.
و در نهایت لایه Data که با دیتابیس لوکال و سرور در ارتباطه.
حالا برای اینکه حالت آفلاین/آنلاین درست مدیریت بشه، اول باید کاری کنیم که همهی دادهها اول به صورت لوکال ذخیره بشن؛ چه اینترنت باشه چه نباشه. یعنی مثلا از دیتابیسهایی مثل Drift یا Hive استفاده میکنیم و اطلاعاتو اونجا نگه میداریم.
نکتهی مهم اینه که وقتی کاربر دادهای رو وارد میکنه، باید اون عملیات (مثل افزودن، ویرایش، یا حذف) به شکل یه "عملیات همگامسازی" ثبت بشه. یه چیزی شبیه به صف عملیات، که مثلا بگه: این یادداشت قراره ساخته بشه، این یکی ویرایش بشه، اون یکی حذف بشه... و همینطور(یه جواریی یه سری فلگ داریم)
هر کدوم از این عملیات یه state دارن: در حال انتظار، انجام شده، یا ناموفق. بعد یه چیزی به اسم Sync Engine
(اینو پیامای بعدی توضیح میدم) داریم که وقتی اینترنت وصل شد، میاد یکییکی این عملیاتها رو اجرا میکنه و اونا رو با سرور هماهنگ میکنه.
اینجا باید حواسمون به چند تا چیز باشه:
اگه عملیات موفق بود، علامت میزنیم که همگام شده.
اگه شکست خورد، اون عملیات توی صف میمونه تا بعداً دوباره امتحانش کنیم.
ممکنه کانفلیکت هم پیش بیاد. مثلاً کاربر آفلاین یه چیزی رو تغییر داده، همزمان سرور هم اون داده رو عوض کرده. تو این حالت یا از روش سادهی "آخرین تغییر برنده است" استفاده میکنیم، یا یه استراتژی ترکیبی داریم، یا حتی به کاربر نشون میدیم که یه تضاد وجود داره.
در نهایت نقش هر لایه توی اپ اینجوری تقسیم میشه:
لایه UI فقط داده رو نمایش میده و وضعیت sync رو نشون میده.
لایه Application عملیات رو مدیریت میکنه و موتور sync رو راه میاندازه.
لایه Domain منطق اصلی رو داره، مثل تعریف موجودیتها، عملیاتها، و اینکه sync چجوری انجام بشه
لایه Data چ مسئول ارتباط با دیتابیس لوکال و API سروره.
علاوه بر اینا، باید سیستم رو طوری طراحی کنیم که تغییرات شبکه رو تشخیص بده؛ مثلاً وقتی دوباره آنلاین شدیم، عملیات sync خودکار شروع بشه. برای اینکار از پکیجهایی مثل connectivity_plus استفاده میکنیم.
اگه بخوام خلاصه کنم:
همیشه اول داده رو لوکال ذخیره کن، حتی وقتی آنلاینیم.
تغییرات رو توی یه صف نگه دار.
با یه موتور sync این صف رو مدیریت کن.
اینجوری، یه اپ مقاوم میسازیم که توی هر شرایطی، حتی بدون اینترنت هم درست کار میکنه و هیچ دادهای از دست نمیره
@sasansafari_dev1400
Telegram
sasan safari
چنل شخصی تخصصی، از مهندسی نرم افزار، برنامه نویسی کراس پلتفورم و موبایل محتوا تقدیم میکنم.
❤21❤🔥3