flutter — правило для Cursor: стандарты Flutter-проекта
Правило задаёт Cursor единый стиль Flutter-кода: форматирование, линты, слои MVVM и Riverpod. Пригодится, когда агент пишет виджеты и состояние в одном файле.
.cursor/rules/flutter.mdcЧто делает flutter
Файл .cursor/rules/flutter.mdc подключается к Cursor и работает как инструкция для агента на каждом запросе. Внутри — набор требований к организации Flutter-приложения: форматирование через dart format, включённый editor.formatOnSave, статический анализ на flutter_lints. Агент перестаёт спорить о стиле и ловит типовые ошибки раньше.
Структуру проекта правило задаёт через MVVM. UI-слой — это Views и ViewModels, слой данных — Repositories и Services. Файлы раскладываются по фичам: features/auth/presentation/screens, features/auth/domain/models, features/auth/data/services. Для состояния и внедрения зависимостей выбран Riverpod — в примерах есть Provider для репозитория и StateNotifierProvider для вьюмодели.
Правило рассчитано на Dart 3.10+ и современный синтаксис: const конструкторы, super.key. Если проект ещё на старом Dart или построен на Provider и setState, примеры придётся переписывать под себя — это повод сначала проверить версию SDK.
Какие задачи решает
- договориться о едином форматировании и линтах в команде
- разложить Flutter-проект по фичам и слоям
- вынести состояние из виджетов во вьюмодели
- подключить Riverpod вместо ручного внедрения зависимостей
- показать агенту примеры правильного и неправильного кода
Примеры запросов агенту
- Создай экран логина по структуре из правила:
features/auth/presentation/screens/login_screen.dartи вьюмодель рядом. - Отрефактори этот виджет под MVVM и Riverpod, как описано в правиле flutter.
- Проверь мой
main.dartна соответствие правилу: const-конструкторы, форматирование, линты.
Как установить flutter
Вручную: положить файлы
.cursor/rules/flutter.mdcВо frontmatter: description, globs, alwaysApply
Вручную: положить файлы
.claude/rules/flutter.mdПоле paths во frontmatter ограничивает файлы: globs из источника → paths
AGENTS.md
Codex читает AGENTS.md: вставьте текст правила туда
Вручную: положить файлы
.github/instructions/flutter.instructions.mdПоле applyTo задаёт, к каким файлам применять: globs из источника → applyTo
Вручную: положить файлы
.devin/rules/flutter.mdВручную: положить файлы
.clinerules/flutter.mdПо шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules
Из того же набора69
Похожие
Рядом в теме «Мобильная разработка»
Всё по теме «Мобильная разработка» →Вопросы о flutter
Как установить правило flutter в Cursor?
Создайте файл .cursor/rules/flutter.mdc в корне проекта и вставьте в него содержимое правила. Cursor подхватит его автоматически.
Что делает правило flutter?
Задаёт агенту стандарты Flutter-кода: форматирование и линты, структуру по фичам, разделение на UI и Data слои, Riverpod для состояния и зависимостей.
Для какой версии Dart подходит правило?
Примеры написаны под Dart 3.10+ с const конструкторами и super.key. На более старом SDK их придётся адаптировать.
Исходный текст
flutter.mdc · CC0-1.0
---
description: Definitive guidelines for writing high-quality, performant, and maintainable Flutter applications using modern Dart 3.10+ practices.
globs: **/*
---
# flutter Best Practices
## Code Organization and Structure
### 1.1 Enforce Consistent Formatting and Linting
Always use `dart format` and enable `editor.formatOnSave` in your IDE. Integrate `flutter_lints` for robust static analysis. This eliminates style debates and catches common errors early.
❌ BAD (Manual formatting, inconsistent style)
```dart
// main.dart
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(title: 'My App', home: MyHomePage());
}
}
```
✅ GOOD (Automated formatting, `flutter_lints` enabled)
```dart
// main.dart
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: const MyHomePage(),
);
}
}
```
### 1.2 Adopt MVVM with Clear Layer Separation
Separate your application into distinct UI and Data layers. The UI layer consists of `Views` (widgets) and `ViewModels` (state logic). The Data layer comprises `Repositories` (business logic, data access) and `Services` (external API calls). This ensures maintainability and testability.
* **`lib/` structure:**
* `features/`: Group by feature (e.g., `auth/`, `products/`).
* `auth/`:
* `presentation/`:
* `screens/`: `login_screen.dart` (View)
* `viewmodels/`: `login_viewmodel.dart` (ViewModel)
* `domain/`:
* `models/`: `user.dart` (Immutable data model)
* `repositories/`: `auth_repository.dart` (Abstract interface)
* `data/`:
* `repositories/`: `auth_repository_impl.dart` (Concrete implementation)
* `services/`: `auth_api_service.dart` (API calls)
### 1.3 Use Riverpod for State Management and Dependency Injection
Riverpod is the definitive choice for state management and dependency injection. It provides compile-time safety, simplifies testing, and eliminates common `Provider` pitfalls.
❌ BAD (InheritedWidget/Provider for DI, manual state updates)
```dart
// In a widget
final userRepo = Provider.of<UserRepository>(context);
// ...
userRepo.fetchUsers().then((_) => setState(() { /* ... */ }));
```
✅ GOOD (Riverpod for DI and state, auto-rebuilds)
```dart
// providers.dart
final authRepositoryProvider = Provider<AuthRepository>((ref) => AuthRepositoryImpl(ref.read(authApiService)));
final loginViewModelProvider = StateNotifierProvider<LoginViewModel, LoginState>((ref) => LoginViewModel(ref.read(authRepositoryProvider)));
// login_screen.dart (View)
class LoginScreen extends ConsumerWidget {
const LoginScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final loginState = ref.watch(loginViewModelProvider);
// ... UI with loginState.isLoading, loginState.error, etc.
ElevatedButton(
onPressed
© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc