import 'package:shared_preferences/shared_preferences.dart'; import 'package:device_apps/device_apps.dart'; import 'dart:async'; const String FAVORITES = 'favorites'; const String SEPERATOR = ','; StreamController> favorites_$ = StreamController>.broadcast(); Future getApplication(String pkg) async { if (pkg == null || pkg.length == 0) return null; try { return DeviceApps.getApp(pkg); } catch(e) { return null; } } Future> getFavorites() async { final prefs = await SharedPreferences.getInstance(); String rawFavoritesList = prefs.getString(FAVORITES); List packageNames = rawFavoritesList?.split(SEPERATOR) ?? []; Iterable> futures = packageNames.map(getApplication); List result = await Future.wait(futures); return result.where((a) => a != null).toList(); } void initFavorites() async { List fs = await getFavorites(); favorites_$.add(fs); } Stream> getFavorites$() { return favorites_$.stream; } void setFavorites(List favs) async { final prefs = await SharedPreferences.getInstance(); String rawFavoritesList = favs.map((Application app) => app.packageName).toList().join(SEPERATOR); prefs.setString(FAVORITES, rawFavoritesList); favorites_$.add(await getFavorites()); } void addToFavorites(Application app) async { List fs = await getFavorites() as List; var matching = fs.where((a) => a.packageName == app.packageName); if(matching.length == 0) { fs.add(app); } await setFavorites(fs); } void removeFromFavorites(Application app) async { List fs = await getFavorites() as List; fs.removeWhere((a) => a.packageName == app.packageName); await setFavorites(fs); }