Give up on the idea of providing smooth-scrolling because Flutter sucks.

This commit is contained in:
Vishnu Mohandas 2020-04-13 23:23:03 +05:30
parent 6a73208b00
commit 6e7b03a048
4 changed files with 62 additions and 68 deletions

View file

@ -47,7 +47,11 @@ class PhotoSyncManager {
final maxBufferLimit = 1000;
for (AssetEntity asset in _assets) {
if (asset.createDateTime.microsecondsSinceEpoch > lastDBUpdateTimestamp) {
photos.add(await Photo.fromAsset(asset));
try {
photos.add(await Photo.fromAsset(asset));
} catch (e) {
_logger.e(e);
}
if (photos.length > bufferLimit) {
await _insertPhotosToDB(
photos, prefs, asset.createDateTime.microsecondsSinceEpoch);

View file

@ -1,14 +1,12 @@
import 'dart:io';
import 'dart:math';
import 'package:draggable_scrollbar/draggable_scrollbar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'package:myapp/db/db_helper.dart';
import 'package:myapp/models/photo.dart';
import 'package:myapp/photo_loader.dart';
import 'package:myapp/ui/image_widget.dart';
import 'package:myapp/utils/date_time_util.dart';
import 'package:provider/provider.dart';
import 'package:share_extend/share_extend.dart';
@ -23,85 +21,40 @@ class Gallery extends StatefulWidget {
}
class _GalleryState extends State<Gallery> {
Map<int, String> _months = {
1: "January",
2: "February",
3: "March",
4: "April",
5: "May",
6: "June",
7: "July",
8: "August",
9: "September",
10: "October",
11: "November",
12: "December",
};
Map<int, String> _days = {
1: "Monday",
2: "Tuesday",
3: "Wednesday",
4: "Thursday",
5: "Friday",
6: "Saturday",
7: "Sunday",
};
PhotoLoader get photoLoader => Provider.of<PhotoLoader>(context);
final ScrollController _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return ChangeNotifierBuilder(
value: photoLoader,
builder: (_, __) {
return DraggableScrollbar.semicircle(
labelTextBuilder: (double offset) {
int itemIndex = _scrollController.hasClients
? (_scrollController.offset /
_scrollController.position.maxScrollExtent *
photoLoader.collatedPhotos.length)
.floor()
: 0;
itemIndex = min(itemIndex, photoLoader.collatedPhotos.length);
var photos = photoLoader.collatedPhotos[itemIndex];
var date =
DateTime.fromMicrosecondsSinceEpoch(photos[0].createTimestamp);
return Text(
_months[date.month],
style: TextStyle(color: Colors.black),
);
},
labelConstraints: BoxConstraints.tightFor(width: 80.0, height: 30.0),
controller: _scrollController,
child: ListView.builder(
value: photoLoader,
builder: (_, __) {
return ListView.builder(
itemCount: photoLoader.collatedPhotos.length,
itemBuilder: _buildListItem,
controller: _scrollController,
),
);
},
);
);
});
}
Widget _buildListItem(BuildContext context, int index) {
var photos = photoLoader.collatedPhotos[index];
return Column(
children: <Widget>[_getDay(photos), _getGallery(photos)],
children: <Widget>[
_getDay(photos[0].createTimestamp),
_getGallery(photos)
],
);
}
Widget _getDay(List<Photo> photos) {
var date = DateTime.fromMicrosecondsSinceEpoch(photos[0].createTimestamp);
Widget _getDay(int timestamp) {
return Container(
padding: const EdgeInsets.all(4.0),
padding: const EdgeInsets.all(8.0),
alignment: Alignment.centerLeft,
child: Text(_days[date.weekday] +
", " +
_months[date.month] +
" " +
date.day.toString()),
child: Text(
getDayAndMonth(DateTime.fromMicrosecondsSinceEpoch(timestamp)),
style: TextStyle(fontSize: 16),
),
);
}

View file

@ -18,6 +18,10 @@ class ImageWidget extends StatefulWidget {
}
class _ImageWidgetState extends State<ImageWidget> {
static final Widget loadingWidget = Container(
alignment: Alignment.center,
color: Colors.grey[500],
);
@override
Widget build(BuildContext context) {
final path = widget.photo.localPath;
@ -42,10 +46,7 @@ class _ImageWidgetState extends State<ImageWidget> {
ImageLruCache.setData(path, size, image);
return image;
} else {
return Container(
alignment: Alignment.center,
color: Colors.grey[500],
);
return loadingWidget;
}
},
);

View file

@ -0,0 +1,36 @@
Map<int, String> _months = {
1: "Jan",
2: "Feb",
3: "March",
4: "April",
5: "May",
6: "Jun",
7: "July",
8: "Aug",
9: "Sep",
10: "Oct",
11: "Nov",
12: "Dec",
};
Map<int, String> _days = {
1: "Mon",
2: "Tue",
3: "Wed",
4: "Thu",
5: "Fri",
6: "Sat",
7: "Sun",
};
String getMonthAndYear(DateTime dateTime) {
return _months[dateTime.month] + " " + dateTime.year.toString();
}
String getDayAndMonth(DateTime dateTime) {
return _days[dateTime.weekday] +
", " +
_months[dateTime.month] +
" " +
dateTime.day.toString();
}