init static method
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');
}