From 2558c851c056f6b4ee48a8403e5e13e85286d262 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 15 Jul 2023 18:18:35 -0400 Subject: [PATCH] Improve App load performance (#579) --- lib/providers/apps_provider.dart | 39 ++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index b1da1b2..52fcec3 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -725,21 +725,12 @@ class AppsProvider with ChangeNotifier { notifyListeners(); var sp = SourceProvider(); List> errors = []; - List newApps = (await getAppsDir()) + List newApps = (await getAppsDir()) // Parse Apps from JSON .listSync() .where((item) => item.path.toLowerCase().endsWith('.json')) - .toList(); - for (var e in newApps) { + .map((e) { try { - var app = App.fromJson(jsonDecode(File(e.path).readAsStringSync())); - try { - var info = await getInstalledInfo(app.id); - sp.getSource(app.url, overrideSource: app.overrideSource); - apps[app.id] = AppInMemory(app, null, info); - notifyListeners(); - } catch (e) { - errors.add([app.id, app.finalName, e.toString()]); - } + return App.fromJson(jsonDecode(File(e.path).readAsStringSync())); } catch (err) { if (err is FormatException) { logs.add('Corrupt JSON when loading App (will be ignored): $e'); @@ -748,6 +739,30 @@ class AppsProvider with ChangeNotifier { rethrow; } } + }).toList(); + for (var app in newApps) { + // Put Apps into memory to list them (fast) + if (app != null) { + try { + apps[app.id] = AppInMemory(app, null, null); + } catch (e) { + errors.add([app.id, app.finalName, e.toString()]); + } + } + } + notifyListeners(); + for (var app in newApps) { + // Check install status for each App (slow) + if (app != null) { + try { + apps[app.id]?.installedInfo = await getInstalledInfo(app.id); + sp.getSource(app.url, overrideSource: app.overrideSource); + } catch (e) { + apps.remove(app.id); + errors.add([app.id, app.finalName, e.toString()]); + } + notifyListeners(); + } } if (errors.isNotEmpty) { removeApps(errors.map((e) => e[0]).toList());