removeAssets static method
Implementation
static void removeAssets(List<String> assetPaths) {
final file = File(_pubspecPath);
if (!file.existsSync()) return;
final lines = file.readAsLinesSync();
final toRemove = assetPaths.toSet();
final result = <String>[];
bool inFlutter = false;
bool inAssets = false;
int? assetsIndex;
int? flutterIndex;
for (final line in lines) {
final trimmed = line.trim();
// root flutter section
if (!line.startsWith(' ') && trimmed == 'flutter:') {
inFlutter = true;
flutterIndex = result.length;
result.add(line);
continue;
}
// assets section
if (inFlutter && line.startsWith(' ') && trimmed == 'assets:') {
inAssets = true;
assetsIndex = result.length;
result.add(line);
continue;
}
// exit assets block
if (inAssets &&
trimmed.isNotEmpty &&
line.startsWith(' ') &&
!line.startsWith(' ') &&
trimmed != 'assets:') {
inAssets = false;
}
// remove assets
if (inAssets && trimmed.startsWith('- ')) {
final asset = trimmed.substring(2).trim();
if (toRemove.contains(asset)) {
continue;
}
}
result.add(line);
}
// remove empty assets section
if (assetsIndex != null) {
bool hasAssets = false;
for (int i = assetsIndex + 1; i < result.length; i++) {
final line = result[i];
if (line.startsWith(' - ')) {
hasAssets = true;
break;
}
if (line.startsWith(' ') &&
!line.startsWith(' ') &&
line.trim().isNotEmpty) {
break;
}
if (!line.startsWith(' ') && line.trim().isNotEmpty) {
break;
}
}
if (!hasAssets) {
result.removeAt(assetsIndex);
}
}
// remove empty flutter section
if (flutterIndex != null) {
bool hasFlutterContent = false;
for (int i = flutterIndex + 1; i < result.length; i++) {
final line = result[i];
if (line.startsWith(' ') && line.trim().isNotEmpty) {
hasFlutterContent = true;
break;
}
if (!line.startsWith(' ') && line.trim().isNotEmpty) {
break;
}
}
if (!hasFlutterContent) {
result.removeAt(flutterIndex);
}
}
file.writeAsStringSync('${result.join('\n')}\n');
}