2022-12-29 08:45:28 +03:00
|
|
|
import 'package:bottom_sheet_bar/bottom_sheet_bar.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:gallery_picker/controller/gallery_controller.dart';
|
|
|
|
import '/gallery_picker.dart';
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
import '../controller/bottom_sheet_controller.dart';
|
|
|
|
|
|
|
|
class BottomSheetLayout extends StatefulWidget {
|
|
|
|
final Widget child;
|
|
|
|
final Config? config;
|
2022-12-31 16:43:05 +03:00
|
|
|
final List<MediaFile>? initSelectedMedia;
|
|
|
|
final List<MediaFile>? extraRecentMedia;
|
|
|
|
final bool singleMedia;
|
|
|
|
final Function(List<MediaFile> selectedMedia) onSelect;
|
2022-12-29 08:45:28 +03:00
|
|
|
final Widget Function(String tag, MediaFile media, BuildContext context)?
|
|
|
|
heroBuilder;
|
2022-12-31 16:43:05 +03:00
|
|
|
final Widget Function(List<MediaFile> media, BuildContext context)?
|
|
|
|
multipleMediaBuilder;
|
2022-12-29 08:45:28 +03:00
|
|
|
final bool startWithRecent;
|
2022-12-30 05:18:18 +03:00
|
|
|
BottomSheetLayout(
|
2022-12-29 08:45:28 +03:00
|
|
|
{super.key,
|
|
|
|
required this.child,
|
|
|
|
required this.onSelect,
|
|
|
|
this.config,
|
|
|
|
this.heroBuilder,
|
2022-12-31 16:43:05 +03:00
|
|
|
this.initSelectedMedia,
|
|
|
|
this.extraRecentMedia,
|
|
|
|
this.singleMedia = false,
|
|
|
|
this.multipleMediaBuilder,
|
2022-12-30 05:18:18 +03:00
|
|
|
this.startWithRecent = true}) {
|
2022-12-31 16:43:05 +03:00
|
|
|
if (GetInstance().isRegistered<PhoneGalleryController>()) {
|
|
|
|
if (initSelectedMedia != null) {
|
|
|
|
Get.find<PhoneGalleryController>()
|
|
|
|
.updateSelectedFiles(initSelectedMedia!);
|
|
|
|
}
|
|
|
|
if (extraRecentMedia != null) {
|
|
|
|
Get.find<PhoneGalleryController>()
|
|
|
|
.updateExtraRecentMedia(extraRecentMedia!);
|
|
|
|
}
|
2022-12-30 05:18:18 +03:00
|
|
|
}
|
|
|
|
}
|
2022-12-29 08:45:28 +03:00
|
|
|
|
|
|
|
@override
|
|
|
|
State<BottomSheetLayout> createState() => _BottomSheetLayoutState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _BottomSheetLayoutState extends State<BottomSheetLayout> {
|
|
|
|
BuildContext? collapsedContext;
|
|
|
|
bool viewCollapsedPicker = false;
|
|
|
|
BottomSheetBarController bottomSheetBarController =
|
|
|
|
BottomSheetBarController();
|
|
|
|
late BottomSheetController controller;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
controller = Get.put(BottomSheetController(bottomSheetBarController));
|
|
|
|
super.initState();
|
|
|
|
}
|
|
|
|
|
|
|
|
check() async {
|
|
|
|
var sheetController = controller.sheetController;
|
|
|
|
if (collapsedContext != null) {
|
|
|
|
final RenderBox renderBox =
|
|
|
|
collapsedContext!.findRenderObject() as RenderBox;
|
|
|
|
if (renderBox.size.height > 200 &&
|
|
|
|
!sheetController.isExpanded &&
|
|
|
|
!viewCollapsedPicker) {
|
2022-12-30 05:18:18 +03:00
|
|
|
await Future.delayed(const Duration(milliseconds: 100));
|
2022-12-29 08:45:28 +03:00
|
|
|
controller.appBarTapping = false;
|
|
|
|
setState(() {
|
|
|
|
viewCollapsedPicker = true;
|
|
|
|
});
|
|
|
|
} else if ((renderBox.size.height <= 200 || sheetController.isExpanded)) {
|
|
|
|
if (viewCollapsedPicker) {
|
|
|
|
viewCollapsedPicker = false;
|
|
|
|
controller.appBarTapping = false;
|
2022-12-30 05:18:18 +03:00
|
|
|
await Future.delayed(const Duration(milliseconds: 10));
|
2022-12-29 08:45:28 +03:00
|
|
|
setState(() {});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
2023-01-01 20:37:31 +03:00
|
|
|
controller.disposeController();
|
2022-12-29 08:45:28 +03:00
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-01-02 17:06:19 +03:00
|
|
|
return GetBuilder<BottomSheetController>(builder: (controller) {
|
|
|
|
return BottomSheetBar(
|
|
|
|
willPopScope: true,
|
|
|
|
height: 0,
|
|
|
|
color: Colors.transparent,
|
|
|
|
locked:
|
|
|
|
(controller.sheetController.isExpanded && !controller.appBarTapping)
|
2022-12-29 08:45:28 +03:00
|
|
|
? true
|
|
|
|
: false,
|
2023-01-02 17:06:19 +03:00
|
|
|
controller: controller.sheetController,
|
|
|
|
expandedBuilder: (scrollController) {
|
|
|
|
check();
|
|
|
|
return controller.sheetController.isExpanded
|
|
|
|
? GalleryPickerView(
|
|
|
|
onSelect: widget.onSelect,
|
|
|
|
config: widget.config,
|
|
|
|
sheetController: bottomSheetBarController,
|
|
|
|
heroBuilder: widget.heroBuilder,
|
|
|
|
multipleMediaBuilder: widget.multipleMediaBuilder,
|
|
|
|
singleMedia: widget.singleMedia,
|
|
|
|
initSelectedMedia: widget.initSelectedMedia,
|
|
|
|
extraRecentMedia: widget.extraRecentMedia,
|
|
|
|
startWithRecent: widget.startWithRecent,
|
|
|
|
)
|
|
|
|
: Container(
|
|
|
|
width: MediaQuery.of(context).size.width,
|
|
|
|
height: MediaQuery.of(context).size.height,
|
|
|
|
color: Colors.transparent,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
body: widget.child,
|
|
|
|
collapsed: GetBuilder<BottomSheetController>(
|
|
|
|
builder: (controller) => ViewCollapsed(
|
|
|
|
picker: GalleryPickerView(
|
|
|
|
onSelect: widget.onSelect,
|
|
|
|
config: widget.config,
|
|
|
|
sheetController: bottomSheetBarController,
|
|
|
|
heroBuilder: widget.heroBuilder,
|
|
|
|
singleMedia: widget.singleMedia,
|
|
|
|
multipleMediaBuilder: widget.multipleMediaBuilder,
|
|
|
|
initSelectedMedia: widget.initSelectedMedia,
|
|
|
|
isCollapsedSheet: true,
|
|
|
|
extraRecentMedia: widget.extraRecentMedia,
|
|
|
|
startWithRecent: widget.startWithRecent,
|
|
|
|
),
|
|
|
|
viewPicker: controller.isClosing ? false : viewCollapsedPicker,
|
|
|
|
onBuild: (context) {
|
|
|
|
collapsedContext = context;
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
});
|
2022-12-29 08:45:28 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class ViewCollapsed extends StatelessWidget {
|
|
|
|
final GalleryPickerView picker;
|
|
|
|
final bool viewPicker;
|
|
|
|
final Function(BuildContext context) onBuild;
|
2022-12-30 05:18:18 +03:00
|
|
|
const ViewCollapsed({
|
2022-12-29 08:45:28 +03:00
|
|
|
super.key,
|
|
|
|
required this.picker,
|
|
|
|
required this.onBuild,
|
|
|
|
required this.viewPicker,
|
|
|
|
});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
onBuild(context);
|
|
|
|
return Container(
|
|
|
|
height: 50,
|
2023-01-02 17:09:57 +03:00
|
|
|
color: Colors.transparent,
|
2022-12-29 08:45:28 +03:00
|
|
|
child: viewPicker ? picker : null,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|