Используем provider для state management в Flutter приложении.

  • 25 сентября 2024
  • 25 просмотров
  • 0 комментариев

При использовании Clean Architecture в Flutter-приложении, вы можете внедрить provider для управления состоянием в слое представления (Presentation Layer). Вот пошаговое руководство по интеграции provider в ваше приложение:

1. Структурируйте приложение по слоям

  • Слой данных (Data Layer): отвечает за получение данных из внешних источников (API, базы данных и т.д.).
  • Доменный слой (Domain Layer): содержит бизнес-логику, сущности и use cases.
  • Слой представления (Presentation Layer): включает UI-компоненты и управление состоянием.

2. Настройте зависимость provider

Добавьте в файл pubspec.yaml зависимость:

dependencies:
  provider: ^6.0.0

3. Создайте классы для управления состоянием

В слое представления создайте классы, наследующиеся от ChangeNotifier, которые будут управлять состоянием и взаимодействовать с доменным слоем.

class ExampleViewModel extends ChangeNotifier {
  final GetDataUseCase _getDataUseCase;

  ExampleViewModel(this._getDataUseCase);

  String _data;
  bool _isLoading = false;

  String get data => _data;
  bool get isLoading => _isLoading;

  Future<void> fetchData() async {
    _isLoading = true;
    notifyListeners();

    _data = await _getDataUseCase.execute();

    _isLoading = false;
    notifyListeners();
  }
}

4. Настройте Dependency Injection

Используйте пакет get_it для внедрения зависимостей.

final getIt = GetIt.instance;

void setup() {
  // Регистрация use cases
  getIt.registerLazySingleton<GetDataUseCase>(() => GetDataUseCaseImpl());

  // Регистрация ViewModel
  getIt.registerFactory<ExampleViewModel>(() => ExampleViewModel(getIt<GetDataUseCase>()));
}

5. Предоставьте провайдеры в главном виджете

В main.dart используйте MultiProvider для предоставления ваших ViewModel всему дереву виджетов.

void main() {
  setup();
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => getIt<ExampleViewModel>(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

6. Используйте ViewModel в виджетах

В ваших UI-компонентах получайте данные из ViewModel.

class ExamplePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final viewModel = Provider.of<ExampleViewModel>(context);

    return Scaffold(
      appBar: AppBar(title: Text('Пример')),
      body: viewModel.isLoading
          ? Center(child: CircularProgressIndicator())
          : Center(child: Text(viewModel.data ?? 'Нет данных')),
      floatingActionButton: FloatingActionButton(
        onPressed: viewModel.fetchData,
        child: Icon(Icons.download),
      ),
    );
  }
}

7. Соблюдайте принципы Clean Architecture

  • Слой представления взаимодействует с доменным слоем через use cases.
  • Доменный слой независим и не зависит от других слоев.
  • Слой данных реализует интерфейсы из доменного слоя и предоставляет данные.

8. Разделите ответственность

  • Держите бизнес-логику в доменном слое.
  • Используйте ViewModel для управления состоянием и взаимодействия с use cases.
  • UI-компоненты должны быть ответственны только за отображение.

9. Тестирование

Благодаря четкому разделению на слои и использованию DI, вы можете легко писать модульные тесты для каждого слоя.

Таким образом, внедрение provider в ваше приложение с использованием Clean Architecture позволит вам создать масштабируемое и поддерживаемое приложение с четким разделением ответственности.

Посмотреть подходящие вакансии для Flutter-разработчика можно тут!

    Оставьте отзыв
    (минимум 60 знаков)
    Оценка5/5
    Нужно авторизоваться