import 'package:get/get.dart'; import 'module.key.dart'; abstract class Module { static final Map _initModuleMap = {}; List get dependencies => const []; List get routes => const []; Future configureServicesAsync() { return Future.sync(() => configureServices()); } void configureServices() { } T inject( T dependency, { String? tag, bool permanent = false, InstanceBuilderCallback? builder, }) => Get.put(dependency, tag: tag, permanent: permanent, builder: builder); void create( InstanceBuilderCallback builder, { String? tag, bool permanent = true, } ) => Get.create(builder, tag: tag, permanent: permanent); void lazyInject( InstanceBuilderCallback builder, { String? tag, bool fenix = false, }) => Get.lazyPut(builder, tag: tag, fenix: fenix); Future injectAsync( AsyncInstanceBuilderCallback builder, { String? tag, bool permanent = false, }) => Get.putAsync(builder, tag: tag, permanent: permanent); bool isInjected({String? tag}) => Get.isRegistered(tag: tag); Future>> initAsync() async { final routeMap = >{}; for (var dependency in dependencies) { if (_initModuleMap.containsKey(dependency)) { continue; } await dependency.configureServicesAsync(); var childrenRoute = await dependency.initAsync(); routeMap.addAll(childrenRoute); _initModuleMap[dependency] = true; } await configureServicesAsync(); routeMap.assign(ModuleKey(toString()), routes); _initModuleMap[this] = true; return routeMap; } Map> init() { final routeMap = >{}; for (var dependency in dependencies) { if (_initModuleMap.containsKey(dependency)) { continue; } dependency.configureServices(); var childrenRoute = dependency.init(); routeMap.addAll(childrenRoute); _initModuleMap[dependency] = true; } configureServices(); routeMap.assign(ModuleKey(toString()), routes); _initModuleMap[this] = true; return routeMap; } List getRoutes() { List findRoutes = []; findRoutes.addAll(routes); for (var dependency in dependencies) { findRoutes.addAll(dependency.routes); } return findRoutes; } }