run method
The execution body of the command.
Implementation
@override
Future<void> run(List<String> args, {required Logger logger}) async {
if (args.isEmpty) {
logger.error('Usage: deeplink remove-scheme <scheme-name>');
return;
}
final targetScheme = args.first.trim().toLowerCase();
if (targetScheme.isEmpty) {
logger.error('Scheme name cannot be empty.');
return;
}
final finder = ProjectFinder();
final projectRoot = finder.findProjectRoot();
final project = FlutterProject(projectRoot);
final configManager = ConfigManager(projectRoot);
if (!configManager.configExists()) {
logger.error('No configuration found. Please run "deeplink init" first.');
return;
}
final config = configManager.load();
if (!config.schemes.contains(targetScheme)) {
logger.error('Scheme "$targetScheme" is not configured in ${Constants.configFile}.');
return;
}
if (config.schemes.length <= 1) {
logger.warning('You are removing the only configured scheme. Deep links will no longer resolve.');
}
final spinner = Spinner('Removing scheme "$targetScheme"...');
spinner.start();
try {
// 1. Remove from AndroidManifest.xml
if (FileUtils.exists(project.androidManifestPath)) {
var manifestContent = FileUtils.readAsString(project.androidManifestPath);
manifestContent = AndroidManifestEditor().removeScheme(manifestContent, targetScheme);
FileUtils.writeString(project.androidManifestPath, manifestContent);
}
// 2. Remove from Info.plist
if (FileUtils.exists(project.iosPlistPath)) {
var plistContent = FileUtils.readAsString(project.iosPlistPath);
plistContent = PlistEditor().removeScheme(plistContent, targetScheme);
FileUtils.writeString(project.iosPlistPath, plistContent);
}
// 3. Update Configuration and regenerate Flutter constants
final updatedSchemes = List<String>.from(config.schemes)..remove(targetScheme);
final updatedConfig = DeepLinkConfig(
schemes: updatedSchemes,
generateSampleRoutes: config.generateSampleRoutes,
generateDeepLinkManager: config.generateDeepLinkManager,
androidAppLinks: config.androidAppLinks,
iosUniversalLinks: config.iosUniversalLinks,
domains: config.domains,
);
configManager.save(updatedConfig);
final generator = FlutterGenerator(projectRoot, logger);
generator.generate(updatedConfig);
spinner.stop(success: true, finalMessage: 'Scheme "$targetScheme" removed and configuration updated.');
} catch (e) {
spinner.stop(success: false, finalMessage: 'Failed to remove scheme.');
logger.error('Failed to remove scheme: ${e.toString()}');
}
}