Lazy Loading & Pagination, Alpha Channel -> White Conversion, Add Height & Width to DB & API

This commit is contained in:
2021-02-28 19:23:41 -05:00
parent 6827a2994a
commit 745d843af7
18 changed files with 427 additions and 284 deletions

View File

@@ -1,5 +1,4 @@
import 'dart:async';
import 'package:imagini/core/imagini_application.dart';
import 'package:imagini/api/imagini_api_repository.dart';
import 'package:imagini/graphql/imagini_graphql.dart';
@@ -10,36 +9,53 @@ class HomeBloc{
final ImaginiApplication _application;
ImaginiAPIRepository _imaginiAPI;
final _mediaItemsController = StreamController<MediaItems$Query>.broadcast();
Stream<MediaItems$Query> get mediaItemsResult => _mediaItemsController.stream;
final _loginController = StreamController<bool>.broadcast();
Stream<bool> get loginResult => _loginController.stream;
final _authenticatedController = StreamController<bool>.broadcast();
Stream<bool> get authenticatedResult => _authenticatedController.stream;
Map<int, List<MediaItems$Query$MediaItemResponse$MediaItem>> _pagedMediaItemListCache =
Map<int, List<MediaItems$Query$MediaItemResponse$MediaItem>>();
int totalMediaItems;
int _pageSize = 50;
HomeBloc(this._application){
_init();
}
void _init(){
_imaginiAPI = _application.imaginiAPI;
getMediaItems();
}
void dispose(){
_loginController.close();
_authenticatedController.close();
_mediaItemsController.close();
}
Future<CachedNetworkImage> getImage(String fileName, int derivedContentWidth){
return _imaginiAPI.getImage(fileName, derivedContentWidth);
Future<CachedNetworkImage> getMedia(int index, derivedContentWidth) async {
MediaItems$Query$MediaItemResponse$MediaItem mediaDetails = await getMediaDetails(index);
if (mediaDetails == null)
return null;
int derivedContentHeight = (mediaDetails.height / mediaDetails.width * derivedContentWidth).ceil();
return _imaginiAPI.getImage(mediaDetails.fileName, derivedContentWidth, derivedContentHeight);
}
getMediaItems(){
_mediaItemsController.addStream(_imaginiAPI.mediaItems());
Future<MediaItems$Query$MediaItemResponse$MediaItem> getMediaDetails(int index) async {
int itemPage = (index / _pageSize).ceil();
int indexOnPage = index % _pageSize;
if (!_pagedMediaItemListCache.containsKey(itemPage))
await _cachePage(itemPage);
return _pagedMediaItemListCache[itemPage][indexOnPage];
}
_cachePage(int itemPage) async {
MediaItems$Query newItems = await _imaginiAPI.mediaItems(Page(page: itemPage));
totalMediaItems = newItems.mediaItems.page.total;
_pagedMediaItemListCache[itemPage] = newItems.mediaItems.data;
}
checkAuthentication(){