diff --git a/lib/main.dart b/lib/main.dart index abd6848..2f0d478 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -92,71 +92,98 @@ class MyHomePage extends StatefulWidget { State createState() => _MyHomePageState(); } -class _MyHomePageState extends State { +class _MyHomePageState extends State with WidgetsBindingObserver { var _index = 0; var _fetched = false; var _fetchedCount = 0; var _knownPostsSize = -1; var _isDemoUser = false; + AppLifecycleState? _appState; List _feedFilter = []; - Future refresh() async { - widget.api.cache.clear(); + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + print("Lifecycle state changed from $_appState to $state"); + + if (_appState != state) { + if (state == AppLifecycleState.resumed) { + refresh(fullRefresh: false); + } + } + setState(() { - _fetchedCount = 0; - _knownPostsSize = -1; - _feedFilter = []; + _appState = state; + }); + } + + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addObserver(this); + + setState(() { + print("Demo: ${widget.prefs.getBool("isDemo")}"); + _isDemoUser = widget.prefs.getBool("isDemo") ?? false; }); + refresh(fullRefresh: true).then((_) => setState(() { + _fetched = true; + })); + } + + @override + void dispose() { + super.dispose(); + WidgetsBinding.instance.removeObserver(this); + } + + Future refresh({ required bool fullRefresh }) async { print("Starting refresh"); + listIds() => widget.api.cache.items + .getAll() + .values + .map((value) => value.id) + .toList() + ..sort((a, b) => b - a); + + if (fullRefresh) { + widget.api.cache.clear(); + setState(() { + _fetchedCount = 0; + _knownPostsSize = -1; + _feedFilter = []; + }); + } + var data = await widget.api .request() .withFeeds() .withGroups() .withFavicons() .withItems() - .sinceId(0) + .sinceId(fullRefresh ? 0 : listIds().first) .execute(); while ((data['items'] as List).isNotEmpty && _fetchedCount < fetchMaxPosts) { print("Fetching more items"); - var ids = widget.api.cache.items - .getAll() - .values - .map((value) => value.id) - .toList() - ..sort((a, b) => b - a); + var ids = listIds(); setState(() { _fetchedCount = ids.length; _knownPostsSize = data['total_items'] ?? -1; }); - data = - await widget.api.request().withItems().sinceId(ids.first).execute(); + data = await widget.api.request().withItems().sinceId(ids.first).execute(); print( "Item cache size is now ${widget.api.cache.items.size} ${ids.first} ${ids.last}"); } } - @override - void initState() { - super.initState(); - - setState(() { - print("Demo: ${widget.prefs.getBool("isDemo")}"); - _isDemoUser = widget.prefs.getBool("isDemo") ?? false; - }); - - refresh().then((_) => setState(() { - _fetched = true; - })); - } - @override Widget build(BuildContext context) { var isDemo = widget.prefs.getBool("isDemo"); @@ -218,7 +245,7 @@ class _MyHomePageState extends State { if (loggedIn) { timer.cancel(); - refresh().then((_) => setState(() => _fetched = true)); + refresh(fullRefresh: true).then((_) => setState(() => _fetched = true)); } }); } @@ -285,7 +312,7 @@ class _MyHomePageState extends State { backgroundColor: theme.colorScheme.secondaryContainer, ), ); - refresh().then((_) { + refresh(fullRefresh: false).then((_) { setState(() {}); }); },