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