changed widget structure
This commit is contained in:
parent
aafcc1da63
commit
d3f1b2ceb2
8 changed files with 27 additions and 44 deletions
|
@ -2,7 +2,6 @@ import 'package:aves/model/settings.dart';
|
||||||
import 'package:aves/utils/android_file_utils.dart';
|
import 'package:aves/utils/android_file_utils.dart';
|
||||||
import 'package:aves/widgets/album/all_collection_drawer.dart';
|
import 'package:aves/widgets/album/all_collection_drawer.dart';
|
||||||
import 'package:aves/widgets/album/all_collection_page.dart';
|
import 'package:aves/widgets/album/all_collection_page.dart';
|
||||||
import 'package:aves/widgets/common/fake_app_bar.dart';
|
|
||||||
import 'package:aves/widgets/common/icons.dart';
|
import 'package:aves/widgets/common/icons.dart';
|
||||||
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||||
import 'package:aves/widgets/common/providers/media_store_collection_provider.dart';
|
import 'package:aves/widgets/common/providers/media_store_collection_provider.dart';
|
||||||
|
@ -83,9 +82,9 @@ class _HomePageState extends State<HomePage> {
|
||||||
return MediaQueryDataProvider(
|
return MediaQueryDataProvider(
|
||||||
child: FutureBuilder(
|
child: FutureBuilder(
|
||||||
future: _appSetup,
|
future: _appSetup,
|
||||||
builder: (futureContext, AsyncSnapshot<void> snapshot) {
|
builder: (context, AsyncSnapshot<void> snapshot) {
|
||||||
if (snapshot.hasError) return const Icon(Icons.error);
|
if (snapshot.hasError) return const Icon(Icons.error);
|
||||||
if (snapshot.connectionState != ConnectionState.done) return const CircularProgressIndicator();
|
if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink();
|
||||||
debugPrint('$runtimeType FutureBuilder builder');
|
debugPrint('$runtimeType FutureBuilder builder');
|
||||||
return const MediaStoreCollectionPage();
|
return const MediaStoreCollectionPage();
|
||||||
}),
|
}),
|
||||||
|
@ -99,12 +98,10 @@ class MediaStoreCollectionPage extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
debugPrint('$runtimeType build');
|
debugPrint('$runtimeType build');
|
||||||
return MediaStoreCollectionProvider(
|
return const MediaStoreCollectionProvider(
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
// fake app bar so that content is safe from status bar, even though we use a SliverAppBar
|
body: AllCollectionPage(),
|
||||||
appBar: FakeAppBar(),
|
drawer: AllCollectionDrawer(),
|
||||||
body: const AllCollectionPage(),
|
|
||||||
drawer: const AllCollectionDrawer(),
|
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,19 +7,18 @@ import 'package:aves/widgets/common/icons.dart';
|
||||||
import 'package:aves/widgets/fullscreen/fullscreen_page.dart';
|
import 'package:aves/widgets/fullscreen/fullscreen_page.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_sticky_header/flutter_sticky_header.dart';
|
import 'package:flutter_sticky_header/flutter_sticky_header.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class SectionSliver extends StatelessWidget {
|
class SectionSliver extends StatelessWidget {
|
||||||
final ImageCollection collection;
|
final ImageCollection collection;
|
||||||
final Map<dynamic, List<ImageEntry>> sections;
|
final Map<dynamic, List<ImageEntry>> sections;
|
||||||
final dynamic sectionKey;
|
final dynamic sectionKey;
|
||||||
final double screenWidth;
|
|
||||||
|
|
||||||
const SectionSliver({
|
const SectionSliver({
|
||||||
Key key,
|
Key key,
|
||||||
@required this.collection,
|
@required this.collection,
|
||||||
@required this.sections,
|
@required this.sections,
|
||||||
@required this.sectionKey,
|
@required this.sectionKey,
|
||||||
@required this.screenWidth,
|
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -35,16 +34,21 @@ class SectionSliver extends StatelessWidget {
|
||||||
delegate: SliverChildBuilderDelegate(
|
delegate: SliverChildBuilderDelegate(
|
||||||
// TODO TLAD find out why thumbnails are rebuilt (with `initState`) when:
|
// TODO TLAD find out why thumbnails are rebuilt (with `initState`) when:
|
||||||
// - config change (show/hide status bar)
|
// - config change (show/hide status bar)
|
||||||
// - navigating away/back
|
(context, index) {
|
||||||
(sliverContext, index) {
|
|
||||||
final sectionEntries = sections[sectionKey];
|
final sectionEntries = sections[sectionKey];
|
||||||
if (index >= sectionEntries.length) return null;
|
if (index >= sectionEntries.length) return null;
|
||||||
final entry = sectionEntries[index];
|
final entry = sectionEntries[index];
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () => _showFullscreen(sliverContext, entry),
|
key: ValueKey(entry.uri),
|
||||||
child: Thumbnail(
|
onTap: () => _showFullscreen(context, entry),
|
||||||
|
child: Selector<MediaQueryData, double>(
|
||||||
|
selector: (c, mq) => mq.size.width,
|
||||||
|
builder: (c, mqWidth, child) {
|
||||||
|
return Thumbnail(
|
||||||
entry: entry,
|
entry: entry,
|
||||||
extent: screenWidth / columnCount,
|
extent: mqWidth / columnCount,
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -52,6 +56,7 @@ class SectionSliver extends StatelessWidget {
|
||||||
addAutomaticKeepAlives: false,
|
addAutomaticKeepAlives: false,
|
||||||
addRepaintBoundaries: true,
|
addRepaintBoundaries: true,
|
||||||
),
|
),
|
||||||
|
// TODO TLAD custom SliverGridDelegate / SliverGridLayout to lerp between columnCount
|
||||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
crossAxisCount: columnCount,
|
crossAxisCount: columnCount,
|
||||||
),
|
),
|
||||||
|
|
|
@ -18,7 +18,6 @@ class Thumbnail extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final image = ImagePreview(
|
final image = ImagePreview(
|
||||||
key: ValueKey(entry.uri),
|
|
||||||
entry: entry,
|
entry: entry,
|
||||||
width: extent,
|
width: extent,
|
||||||
height: extent,
|
height: extent,
|
||||||
|
|
|
@ -17,16 +17,9 @@ class ThumbnailCollection extends AnimatedWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Selector<MediaQueryData, double>(
|
|
||||||
selector: (c, mq) => mq.size.width,
|
|
||||||
builder: (c, mqWidth, child) {
|
|
||||||
debugPrint('$runtimeType builder mqWidth=$mqWidth');
|
|
||||||
return ThumbnailCollectionContent(
|
return ThumbnailCollectionContent(
|
||||||
collection: collection,
|
collection: collection,
|
||||||
appBar: appBar,
|
appBar: appBar,
|
||||||
screenWidth: mqWidth,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +27,6 @@ class ThumbnailCollection extends AnimatedWidget {
|
||||||
class ThumbnailCollectionContent extends StatelessWidget {
|
class ThumbnailCollectionContent extends StatelessWidget {
|
||||||
final ImageCollection collection;
|
final ImageCollection collection;
|
||||||
final Widget appBar;
|
final Widget appBar;
|
||||||
final double screenWidth;
|
|
||||||
|
|
||||||
final Map<dynamic, List<ImageEntry>> _sections;
|
final Map<dynamic, List<ImageEntry>> _sections;
|
||||||
final ScrollController _scrollController = ScrollController();
|
final ScrollController _scrollController = ScrollController();
|
||||||
|
@ -43,7 +35,6 @@ class ThumbnailCollectionContent extends StatelessWidget {
|
||||||
Key key,
|
Key key,
|
||||||
@required this.collection,
|
@required this.collection,
|
||||||
@required this.appBar,
|
@required this.appBar,
|
||||||
@required this.screenWidth,
|
|
||||||
}) : _sections = collection.sections,
|
}) : _sections = collection.sections,
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
@ -82,7 +73,6 @@ class ThumbnailCollectionContent extends StatelessWidget {
|
||||||
collection: collection,
|
collection: collection,
|
||||||
sections: _sections,
|
sections: _sections,
|
||||||
sectionKey: sectionKey,
|
sectionKey: sectionKey,
|
||||||
screenWidth: screenWidth,
|
|
||||||
);
|
);
|
||||||
if (sectionKey == sectionKeys.last) {
|
if (sectionKey == sectionKeys.last) {
|
||||||
sliver = SliverPadding(
|
sliver = SliverPadding(
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
|
|
||||||
class FakeAppBar extends StatelessWidget with PreferredSizeWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return const SafeArea(child: SizedBox.shrink());
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => Size.zero;
|
|
||||||
}
|
|
|
@ -52,6 +52,7 @@ class ImagePreviewState extends State<ImagePreview> with AfterInitMixin {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didUpdateWidget(ImagePreview old) {
|
void didUpdateWidget(ImagePreview old) {
|
||||||
|
// debugPrint('$runtimeType didUpdateWidget from=${old.entry.path} to=${entry.path}');
|
||||||
super.didUpdateWidget(old);
|
super.didUpdateWidget(old);
|
||||||
if (widget.width == old.width && widget.height == old.height && uri == old.entry.uri && widget.entry.width == old.entry.width && widget.entry.height == old.entry.height && widget.entry.orientationDegrees == old.entry.orientationDegrees) return;
|
if (widget.width == old.width && widget.height == old.height && uri == old.entry.uri && widget.entry.width == old.entry.width && widget.entry.height == old.entry.height && widget.entry.orientationDegrees == old.entry.orientationDegrees) return;
|
||||||
_initByteLoader();
|
_initByteLoader();
|
||||||
|
@ -67,12 +68,14 @@ class ImagePreviewState extends State<ImagePreview> with AfterInitMixin {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
// debugPrint('$runtimeType dispose path=${entry.path}');
|
||||||
_entryChangeNotifier.removeListener(_onEntryChange);
|
_entryChangeNotifier.removeListener(_onEntryChange);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
// debugPrint('$runtimeType build path=${entry.path}');
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: _byteLoader,
|
future: _byteLoader,
|
||||||
builder: (futureContext, AsyncSnapshot<Uint8List> snapshot) {
|
builder: (futureContext, AsyncSnapshot<Uint8List> snapshot) {
|
||||||
|
|
|
@ -65,7 +65,7 @@ class DebugPageState extends State<DebugPage> {
|
||||||
),
|
),
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
future: _dbMetadataLoader,
|
future: _dbMetadataLoader,
|
||||||
builder: (futureContext, AsyncSnapshot<List<CatalogMetadata>> snapshot) {
|
builder: (context, AsyncSnapshot<List<CatalogMetadata>> snapshot) {
|
||||||
if (snapshot.hasError) return Text(snapshot.error.toString());
|
if (snapshot.hasError) return Text(snapshot.error.toString());
|
||||||
if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink();
|
if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink();
|
||||||
return Text('DB metadata rows: ${snapshot.data.length}');
|
return Text('DB metadata rows: ${snapshot.data.length}');
|
||||||
|
@ -73,7 +73,7 @@ class DebugPageState extends State<DebugPage> {
|
||||||
),
|
),
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
future: _dbAddressLoader,
|
future: _dbAddressLoader,
|
||||||
builder: (futureContext, AsyncSnapshot<List<AddressDetails>> snapshot) {
|
builder: (context, AsyncSnapshot<List<AddressDetails>> snapshot) {
|
||||||
if (snapshot.hasError) return Text(snapshot.error.toString());
|
if (snapshot.hasError) return Text(snapshot.error.toString());
|
||||||
if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink();
|
if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink();
|
||||||
return Text('DB address rows: ${snapshot.data.length}');
|
return Text('DB address rows: ${snapshot.data.length}');
|
||||||
|
|
|
@ -41,7 +41,7 @@ class ImagePageState extends State<ImagePage> with AutomaticKeepAliveClientMixin
|
||||||
selector: (c, mq) => mq.size,
|
selector: (c, mq) => mq.size,
|
||||||
builder: (c, mqSize, child) => PhotoViewGallery.builder(
|
builder: (c, mqSize, child) => PhotoViewGallery.builder(
|
||||||
itemCount: entries.length,
|
itemCount: entries.length,
|
||||||
builder: (galleryContext, index) {
|
builder: (context, index) {
|
||||||
final entry = entries[index];
|
final entry = entries[index];
|
||||||
if (entry.isVideo) {
|
if (entry.isVideo) {
|
||||||
final videoController = widget.videoControllers.firstWhere((kv) => kv.item1 == entry.path, orElse: () => null)?.item2;
|
final videoController = widget.videoControllers.firstWhere((kv) => kv.item1 == entry.path, orElse: () => null)?.item2;
|
||||||
|
|
Loading…
Reference in a new issue