Для реализации Dependency Injection (DI) в мобильном приложении на Flutter с использованием Clean Architecture есть несколько популярных библиотек и подходов. Ниже приведен пошаговый процесс реализации DI с использованием библиотеки get_it и генератора кода injectable:
1. Настройка зависимости
Добавьте следующие зависимости в ваш pubspec.yaml
файл:
dependencies:
get_it: ^7.2.0
injectable: ^2.0.0
dev_dependencies:
injectable_generator: ^2.0.0
build_runner: ^2.1.0
2. Конфигурация DI с помощью injectable
Injectable — это удобный способ автоматической генерации кода для внедрения зависимостей с помощью get_it.
2.1. Создайте файл конфигурации
В корневой директории проекта создайте файл lib/di/di.dart
с следующей конфигурацией:
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'di.config.dart'; // Этот файл будет сгенерирован автоматически
final GetIt getIt = GetIt.instance;
@InjectableInit()
void configureDependencies() => getIt.init();
2.2. Добавьте аннотации @injectable и @singleton
Добавьте аннотации к классам, которые вы хотите внедрить через DI. Например:
import 'package:injectable/injectable.dart';
@lazySingleton
class ApiService {
// Ваш сервис
}
@singleton
class AuthRepository {
final ApiService apiService;
AuthRepository(this.apiService);
}
@singleton
— объект будет существовать в единственном экземпляре.@lazySingleton
— экземпляр будет создан только при первом запросе.
2.3. Генерация кода
Для генерации кода выполните команду:
flutter pub run build_runner build
Это создаст файл di.config.dart
, который будет содержать конфигурацию зависимостей.
3. Инициализация DI в приложении
Теперь, в основном файле вашего приложения, инициализируйте зависимости перед запуском приложения:
import 'package:flutter/material.dart';
import 'di/di.dart';
void main() {
configureDependencies();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
4. Использование зависимостей
Теперь вы можете получить любую зарегистрированную зависимость через get_it
:
final authRepository = getIt<AuthRepository>();
Это базовая реализация DI в Flutter с использованием get_it и injectable, которая хорошо вписывается в Clean Architecture.
Альтернативы
- flutter_riverpod — также поддерживает DI через провайдеры зависимостей.
- states_rebuilder — реализует DI с помощью собственного механизма
Injector
.
Посмотреть подходящие вакансии для Flutter-разработчика можно тут!