| کانال توسعهدهندگان فلاتر |
اصل Single Responsibility توی ویجتهای Flutter 🧩
یکی از راحتترین راهها برای تمیز و قابلنگهداری موندن کد Flutter اینه که واقعاً به Single Responsibility Principle (SRP) پایبند بمونیم.
طبق SRP هر کلاس باید فقط یک دلیل برای تغییر داشته باشه. توی Flutter یعنی هر ویجت بهتره فقط روی یک نقش مشخص تمرکز کنه: نمایش، منطق، یا مدیریت state؛ نه همۀ اینها با هم. 😄
وقتی یه صفحه همهچیزو قاطی خودش نگه میداره:
- تستنویسی سخت میشه
- ریفکتور خطرناکتر میشه
- کامپایل hot-reload کندتر حس میشه
نمونهی یه ویجت خلاف SRP 👇
class ProfilePage extends StatefulWidget {
const ProfilePage({super.key});
@override
State<ProfilePage> createState() => _ProfilePageState();
}
class _ProfilePageState extends State<ProfilePage> {
bool _loading = false;
String? _name;
Future<void> _loadProfile() async {
setState(() => _loading = true);
await Future.delayed(const Duration(seconds: 1));
setState(() {
_name = 'Ali';
_loading = false;
});
}
@override
void initState() {
super.initState();
_loadProfile();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Profile')),
body: Center(
child: _loading
? const CircularProgressIndicator()
: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(_name ?? 'Unknown'),
ElevatedButton(
onPressed: _loadProfile,
child: const Text('Reload'),
),
],
),
),
);
}
}
اینجا یک کلاس هم:
- API call شبیهسازی میکنه
- state رو نگه میداره
- UI کامل صفحه رو میسازه
حالا همون ایده رو با احترام به SRP تکهتکه میکنیم 👇
۱) جدا کردن منطق لود پروفایل
class ProfileController extends ChangeNotifier {
bool loading = false;
String? name;
Future<void> loadProfile() async {
loading = true;
notifyListeners();
await Future.delayed(const
4 · 1.2K ·