init static method

Future<void> init({
  1. String envFileName = '.env',
  2. List<Map<String, dynamic>> configs = const [],
  3. List<Map<String, dynamic> Function()> configFactories = const [],
  4. List<ServiceProvider> providers = const [],
})

Initialize the Magic framework.

This bootstraps the application, loads environment variables, initializes storage, and registers core services.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Magic.init(configs: [appConfig]);
  runApp(const MagicApplication());
}

Implementation

static Future<void> init({
  String envFileName = '.env',
  List<Map<String, dynamic>> configs = const [],
  List<Map<String, dynamic> Function()> configFactories = const [],
  List<ServiceProvider> providers = const [],
}) async {
  // 1. Load Environment Variables (Must be first!)
  await Env.load(fileName: envFileName);

  // 2. Evaluate config factories now that Env is loaded
  final factoryConfigs = configFactories.map((f) => f()).toList();
  final allConfigs = [...configs, ...factoryConfigs];

  // 3. Initialize MagicApp
  await MagicApp.init(envFileName: envFileName, configs: allConfigs);

  // Configure URL strategy for web (must be before runApp)
  if (Config.get('routing.url_strategy') == 'path') {
    usePathUrlStrategy();
  }

  // 2. Bind Core Services (before providers so they can use Log)
  app.singleton('log', () => LogManager());

  // 3. Register Core Providers
  // register(CacheServiceProvider(app));
  // register(EncryptionServiceProvider(app));
  // register(DatabaseServiceProvider(app));

  // 4. Register Configured Providers
  final configuredProviders = Config.get('app.providers', []) as List;
  for (final factory in configuredProviders) {
    if (factory is ServiceProvider Function(MagicApp)) {
      register(factory(app));
    }
  }

  // 5. Register Runtime Providers
  for (final provider in providers) {
    register(provider);
  }

  // 6. Boot Framework (Async)
  await boot();

  // 7. Pre-build router to ensure it's ready before runApp
  // This prevents "Could not navigate to initial route" errors on Flutter Web
  final _ = MagicRouter.instance.routerConfig;

  Log.info('Magic framework initialized');
}