changed widget structure

This commit is contained in:
Thibault Deckers 2019-12-27 00:05:47 +09:00
parent aafcc1da63
commit d3f1b2ceb2
8 changed files with 27 additions and 44 deletions

View file

@ -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,
),
);

View file

@ -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,
),

View file

@ -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,

View file

@ -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(

View file

@ -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;
}

View file

@ -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) {

View file

@ -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}');

View file

@ -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;