| کانال توسعه‌دهندگان فلاتر |
1.96K subscribers
33 photos
1 video
13 links
⭕️ کانال توسعه‌دهندگان فلاتر دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
در کد اشتباه بالا، هر بار که لیست اسکرول یا بازسازی می‌شود، متد _heavyComputation مستقیماً داخل build صدا زده می‌شود و عملاً هر بار محاسبات سنگین دوباره انجام می‌گیرد که باعث لگ، مصرف CPU بالا و افت فریم در لیست‌های بزرگ می‌شود.

در نسخه‌ی اصلاح‌شده، نتیجه‌ی محاسبه‌ی سنگین را یک بار در initState به کمک memoization و Future محاسبه کرده و با FutureBuilder فقط همان نتیجه‌ی کش‌شده را استفاده می‌کنیم؛ در نتیجه تعداد اجرای محاسبات سنگین به شدت کم می‌شود و عملکرد اسکرول در <ListView.builder> بهبود چشمگیری پیدا می‌کند.

به‌جای اجرای مستقیم محاسبات پرهزینه در متد build، از تکنیک‌هایی مانند memoization، FutureBuilder و جابه‌جا کردن منطق سنگین به initState استفاده کنید تا هم مصرف منابع کمتر شود و هم تجربه‌ی کاربری در لیست‌های پیچیده بهتر شود.

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
❤2🔥1
در نمونه‌کد بالا در نسخهٔ اول، برای هر بار ساختن ویجت، یک TextEditingController جدید داخل متد build ساخته می‌شود و هیچ‌وقت dispose نمی‌شود؛ این کار هم باعث Memory Leak می‌شود و هم روی پرفورمنس فرم‌های بزرگ اثر منفی دارد. در نسخهٔ دوم، کنترلر به‌صورت فیلد در State نگه‌داری شده، فقط یک‌بار در initState ساخته و در متد dispose آزاد می‌شود. شما در فرم‌های پیچیده و ویجت‌های stateful مشابه، کدام الگو را به‌عنوان روش استاندارد مدیریت Controller‌ها و منابع قابل dispose در Flutter استفاده می‌کنید تا هم از Memory Leak جلوگیری شود و هم مصرف مموری و زمان رندر کنترل شود؟

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
❤4
Forwarded from Developix Support
This media is not supported in your browser
VIEW IN TELEGRAM
🏆آفرهای جام جهانی ۲۰۲۶ هاست‌ایران فعال شد!

با کمپین «ترکیب برنده سایتت»، زیرساخت سایتت رو برای روزهای پرترافیک آماده کن:

🔥 ۲۵٪ تخفیف روی پلن‌های ۳ ماهه هاست اشتراکی ایران
⚡ ۵۰٪ تخفیف روی پلن‌های یک‌ماهه سرویس ابری در دیتاسنترهای تهران، مشهد و اهواز

🧠 مشاوره رایگان زیرساخت توسط کارشناسان هاست‌ایران
فرصت استفاده از تخفیف‌ها و ثبت فرم مشاوره محدود است.

📌 برای کپی کدهای تخفیف و ثبت‌نام در فرم مشاوره، روی لینک زیر کلیک کنید:

📌صفحه فرم مشاوره
📌تلگرام هاست‌ایران
📌بله هاست‌ایران


#هاست_ایران #سرور_ابری_هاست_ایران #هاست_اشتراکی #دیتاسنتر #مشاوره_زیرساخت #جام_جهانی2026
💠 نسخه جدید کتابخانه Dio منتشر شده است

🔸 ارتقا از نسخه 5.9.2 به 5.10.0

🔖 #dio, #flutter, #release

💎 @DevelopixFlutter
👍4❤1
در نمونه‌کد بالا در نسخهٔ اول داخل StreamBuilder برای هر رویداد استریم از setState() استفاده شده؛ در حالی‌که خود ویجت StreamBuilder با هر تغییر در stream ری‌بیلد می‌شود و نیازی به مدیریت دستی state نیست. این کار می‌تواند باعث ری‌بیلدهای اضافی، پیچیدگی بیشتر و بروز باگ در سناریوهای پیچیده‌تر شود. در نسخهٔ دوم با تکیه بر snapshot و حذف setState()، هم کد تمیزتر شده و هم رفتار UI قابل پیش‌بینی‌تر و کاراتر می‌شود. در چنین مواقعی ترجیح می‌دهید state را چطور مدیریت کنید؟

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
❤2👍2
🌀 مدیریت State تمیز در Flutter با Provider + API

اگه پروژه‌هات کم‌کم داره شلوغ می‌شه و setState دیگه جواب نمیده، وقتشه با Provider یه معماری تمیزتر بسازی؛ مخصوصاً وقتی پای درخواست‌های HTTP و API وسطه. این مثال یه todo list ساده‌ست که از یه API واقعی داده می‌گیره و با Provider مدیریت می‌کنه.

این ایده بر اساس مثال‌های رسمی مستندات Provider و مثال‌های Flutter در GitHubه 👇
https://pub.dev/packages/provider
https://docs.flutter.dev/development/data-and-backend/state-mgmt/simple

در این سناریو:
• اپ یه لیست todo از API رایگان JSONPlaceholder می‌گیره.
• State لودینگ، خطا و داده‌ها رو داخل یه ChangeNotifier نگه می‌داریم.
• UI فقط گوش می‌کنه؛ منطق توی لایه provider می‌مونه.

مزیتش؟
کد تمیزتر، testableتر و قابل گسترش‌تر؛ مخصوصاً وقتی بعداً auth، pagination یا کش اضافه می‌کنی.

اول تو pubspec.yaml اینو اضافه کن:
dependencies:
flutter:
sdk: flutter
provider: ^6.1.2
http: ^1.2.2


حالا یه Provider ساده برای todo ها:
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class Todo {
final int id;
final String title;
final bool completed;

Todo({required this.id, required this.title, required this.completed});

factory Todo.fromJson(Map<String, dynamic> json) {
return Todo(
id: json['id'] as int,
title: json['title'] as String,
completed: json['completed'] as bool,
);
}
}

class TodoProvider extends ChangeNotifier {
List<Todo> _todos = [];
bool _isLoading = false;
String? _error;

List<Todo> get todos => _todos;
bool get isLoading => _isLoading;
String? get error => _error;

Future<void> fetchTodos() async {
_isLoading = true;
_error = null;
notifyListeners();

try {
final response = await http.get(
Uri.parse('https://jsonplaceholder.typicode.com/todos?_limit=10'),
);

if (response.statusCode == 200) {
final List data = jsonDecode(response.body) as List;
_todos = data.map((e) => Todo.fromJson(e)).toList();
} else {
_error = 'Error: ' + response.statusCode.toString();
}
} catch (e) {
_error = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
}


نکته‌ها:
• فقط provider درباره API خبر داره؛ UI فقط state رو می‌خونه.
• برای خطا، یه String ساده نگه داشتیم که بعداً راحت می‌تونی با error handling حرفه‌ای‌تر عوضش کنی.

تو main، Provider رو بالا‌ی ویجت‌ها wrap کن:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'todo_provider.dart';

void main() {
runApp(
ChangeNotifierProvider(
create: (_) => TodoProvider()..fetchTodos(),
child: const MyApp(),
),
);
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: TodoPage(),
);
}
}


و تو UI، فقط گوش بده و رندر کن:
• اگه isLoading true بود، CircularProgressIndicator.
• اگه error داشتیم، یه متن ساده.
• در غیر این صورت، ListView از todos.

این الگو برای خیلی سناریوهای واقعی مثل product list، لیست پیام‌ها، notificationها و… یه پایه خیلی خوبه. از همین ساختار شروع می‌شه و کم‌کم می‌رسی به معماری‌های جدی‌تر مثل Clean Architecture.

امتحانش کن، روی یه API ساده شروع کن و قدم‌به‌قدم business logic رو از UI جدا کن؛ کم‌کم تفاوت توی خوانایی و توسعه‌پذیری پروژ‌ه‌هات کاملاً محسوس می‌شه 🚀

🔖 #Flutter #فلاتر #Flutter #Provider #State_Management #API #Dart #HTTP #Mobile

👤 Developix

💎 Channel: @DevelopixFlutter
❤7🔥1
💠 نسخه جدید کتابخانه Dio منتشر شده است

🔸 ارتقا از نسخه 5.10.0 به 5.11.0

🔖 #dio, #flutter, #release

💎 @DevelopixFlutter
👍5
مدیریت state تو پروژه‌های متوسط و بزرگ فلاتر اگر از اول درست طراحی نشه، به‌سرعت تبدیل به spaghetti می‌شه. یکی از تمیزترین راه‌حل‌ها 👇

flutter_riverpod یک state management مدرن و type-safe برای Flutter هست که نسبت به Provider انعطاف و تست‌پذیری خیلی بهتری می‌دهد.

چند نکتهٔ مهم 🔧
• بدون نیاز به InheritedWidget و context-heavy code
• پشتیبانی عالی از hot-reload
• مناسب برای پروژه‌های multi-module و scalable
• تست واحد ساده‌تر برای logic ها

نصب در pubspec.yaml:
dependencies:
flutter_riverpod: ^2.5.0


یک مثال سریع:
final counterProvider = StateProvider<int>((ref) => 0);

class CounterText extends ConsumerWidget {
const CounterText({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('$count');
}
}

FloatingActionButton(
onPressed: () =>
ref.read(counterProvider.notifier).state++,
)


برای پروژه‌هایی که جلوتر از یک todo ساده می‌رن، Riverpod کمک می‌کند ساختار app تمیز، قابل تست و قابل گسترش بمونه. 🚀

Docs رسمی:
https://riverpod.dev
GitHub

🔖 #Flutter #فلاتر #Flutter #Riverpod #State_Management #Dart #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
👍5❤2
💠 نسخه جدید کتابخانه Go Router منتشر شده است

🔸 ارتقا از نسخه 17.3.0 به 17.4.0

🔖 #go_router, #flutter, #release

💎 @DevelopixFlutter
👍2❤1
💠 نسخه جدید کتابخانه Go Router منتشر شده است

🔸 ارتقا از نسخه 17.4.0 به 17.5.0

🔖 #go_router, #flutter, #release

💎 @DevelopixFlutter
❤1
💠 نسخه جدید کیت توسعه فلاتر (Flutter) منتشر شده است

🔸 ارتقا از نسخه 3.44.9 به 3.47.0

🔹 لیست تغییرات این نسخه:


🔖 #flutter, #flutter, #android, #release

💎 @DevelopixFlutter
👍1
‏در کد زیر رفتار Zone در دارت را روی زمان‌بندی scheduleMicrotask و Future می‌بینید.
خروجی نهایی برنامه (ترتیب لاگ‌ها) در کنسول چه خواهد بود؟

به حروف کوچک/بزرگ دقت کنید و ترتیب دقیق خطوط را بنویسید.

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
❤3
💠 نسخه جدید کتابخانه Go Router منتشر شده است

🔸 ارتقا از نسخه 17.5.0 به 18.0.0

🔖 #go_router, #flutter, #release

💎 @DevelopixFlutter
👍4❤1
‏یک ویجت فلاتر این تکه کد دارت را قبل از اولین رندر اجرا می‌کند. خروجی نهایی این برنامه چیست؟ (به ترتیب و دقیقاً همان چیزی که در کنسول چاپ می‌شود)

پیشنهاد: با دقت به ترتیب مقداردهی late و اجرای توابع سازنده و getter نگاه کن 😉

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter
❤2
🔥 پکیج: پکیج شبکهٔ Dio برای فلاتر

برای درخواست‌های HTTP جدی تو فلاتر، پکیج Dio تقریبا استانداردِ de facto حساب می‌شود 🚀

چیزهایی مثل interceptor برای لاگ، auth token و هندل‌کردن ریسپانس، CancelToken برای لغو ریکوئست‌ها (مثلا وقت اسکرول لیست)، و تنظیم timeout، همه آماده است.

آپلود و دانلود فایل، فرم‌دیتا، retry با interceptor سفارشی و adapter/transformer قابل‌تعریف هم دارد.

اگر الان با http خام کار می‌کنی، یه بار اینو امتحان کن 😉
لینک پکیج در pub.dev

📥 دانلود ماهانه: 3,956,008
⭐️ 8,349 لایک

🔖 #Flutter #فلاتر #فلاتر #Dio #شبکه

💎 @DevelopixFlutter
👍4❤3
💠 نسخه جدید کتابخانه Get It منتشر شده است

🔸 ارتقا از نسخه 9.2.1 به 9.3.0

🔖 #get_it, #flutter, #release

💎 @DevelopixFlutter
🔥 پکیج: باز کردن لینک در فلاتر

برای باز کردن لینک از داخل اپ فلاتر، پکیج url_launcher راه سرراستی است. هم آدرس‌های وب را باز می‌کند، هم لینک‌های تماس، پیامک و ایمیل را به اپ مناسب می‌سپارد.

وقتی کاربر باید از صفحهٔ پشتیبانی مستقیم به تماس یا ایمیل برسد، همین پکیج کلی کد اضافه را کم می‌کند. قبل از اجرا هم می‌توانی بررسی کنی که باز کردن آن آدرس ممکن است یا نه.

مستندات و نمونه‌کدش را در pub.dev ببین؛ برای پروژهٔ بعدی به کار می‌آید.

📥 دانلود ماهانه: 6,821,535
⭐️ 8,176 لایک

🔖 #Flutter #فلاتر #Flutter #پکیج_فلاتر #url_launcher

💎 @DevelopixFlutter
👍4
با جابه‌جا شدن ترتیب کارت‌ها، چرا وضعیت هر کارت ممکنه به کارت دیگه منتقل بشه؟ مشکل کد رو چطور درست می‌کنی؟

🔖 #Flutter #فلاتر

👤 Developix

💎 Channel: @DevelopixFlutter