diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index b63769e..51ed8d1 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"permission_handler_apple","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_apple-9.0.7\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_avfoundation-2.3.8\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"permission_handler_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_android-10.2.0\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_android-2.3.10\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[{"name":"permission_handler_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_windows-0.1.2\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"video_player_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_web-2.0.13\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"photo_gallery","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"video_thumbnail","dependencies":[]}],"date_created":"2023-01-20 10:38:51.103847","version":"3.3.10"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"permission_handler_apple","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_apple-9.0.7\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_avfoundation-2.3.8\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"permission_handler_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_android-10.2.0\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_android-2.3.10\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[{"name":"permission_handler_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_windows-0.1.2\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"video_player_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_web-2.0.13\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"photo_gallery","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"video_thumbnail","dependencies":[]}],"date_created":"2023-01-21 03:35:10.968143","version":"3.3.10"} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 89045a3..6e6681c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,4 +103,8 @@ ## 0.3.1 -* fixes formatting issues \ No newline at end of file +* fixes formatting issues + +## 0.3.2 + +* Problems after version 0.3.1 have been resolved \ No newline at end of file diff --git a/README.md b/README.md index d7d9eba..2972d33 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,7 @@ A Config class is provided to user to customize your gallery picker. You can cus ```dart List? media = await GalleryPicker.pickMedia( context: context, + pageTransitionType: PageTransitionType.rightToLeft config: Config( backgroundColor: Colors.white, permissionDeniedPage:PermissionDeniedPage(), diff --git a/example/lib/main.dart b/example/lib/main.dart index 467720a..840ac40 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -173,7 +173,6 @@ class _MyHomePageState extends State { Future pickMedia() async { List? media = await GalleryPicker.pickMedia( context: context, - config: Config(lastWeek: "Bu hafta"), initSelectedMedia: selectedMedias, extraRecentMedia: selectedMedias, startWithRecent: true); diff --git a/example/pubspec.lock b/example/pubspec.lock index c48068b..71609b0 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -21,7 +21,7 @@ packages: name: bottom_sheet_scaffold url: "https://pub.dartlang.org" source: hosted - version: "0.1.1" + version: "0.1.2" camera: dependency: "direct dev" description: @@ -141,7 +141,7 @@ packages: path: ".." relative: true source: path - version: "0.3.1" + version: "0.3.2" get: dependency: transitive description: @@ -198,6 +198,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + page_transition: + dependency: transitive + description: + name: page_transition + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" path: dependency: transitive description: diff --git a/lib/controller/gallery_controller.dart b/lib/controller/gallery_controller.dart index 8d71867..97b6f4c 100644 --- a/lib/controller/gallery_controller.dart +++ b/lib/controller/gallery_controller.dart @@ -47,7 +47,7 @@ class PhoneGalleryController extends GetxController { late bool startWithRecent; late bool isRecent; - bool permissionGranted = false; + bool? permissionGranted; bool configurationCompleted = false; late Function(List selectedMedias) onSelect; Widget Function(String tag, MediaFile media, BuildContext context)? @@ -70,12 +70,13 @@ class PhoneGalleryController extends GetxController { GalleryAlbum? selectedAlbum; void resetBottomSheetView() { - if (permissionGranted) { + if (permissionGranted == true) { isRecent = true; if (selectedAlbum == null) { pickerPageController.jumpToPage(0); } else { pageController.jumpToPage(0); + pickerPageController = PageController(); } selectedAlbum = null; update(); @@ -112,6 +113,7 @@ class PhoneGalleryController extends GetxController { required bool isBottomSheet}) async { _selectedFiles.clear(); selectedAlbum = album; + update(); updatePickerListener(); await pageController.animateToPage(1, duration: const Duration(milliseconds: 500), curve: Curves.easeIn); @@ -121,9 +123,11 @@ class PhoneGalleryController extends GetxController { _selectedFiles.clear(); _pickerMode = false; pickerPageController = PageController(initialPage: 1); + update(); await pageController.animateToPage(0, duration: const Duration(milliseconds: 500), curve: Curves.easeIn); selectedAlbum = null; + update(); } void unselectMedia(MediaFile file) { diff --git a/lib/gallery_picker.dart b/lib/gallery_picker.dart index ef60f7a..e42154f 100644 --- a/lib/gallery_picker.dart +++ b/lib/gallery_picker.dart @@ -6,6 +6,7 @@ export 'models/mode.dart'; export 'models/medium.dart'; export 'models/gallery_media.dart'; export 'models/gallery_album.dart'; +export 'package:page_transition/src/enum.dart'; export 'user_widgets/thumbnail_media.dart'; export 'user_widgets/album_categories_view.dart'; export 'user_widgets/album_media_view.dart'; @@ -21,6 +22,7 @@ import 'package:bottom_sheet_scaffold/bottom_sheet_scaffold.dart'; import 'package:flutter/material.dart'; import 'package:gallery_picker/models/gallery_media.dart'; import 'package:get/get.dart'; +import 'package:page_transition/page_transition.dart'; import '../../controller/gallery_controller.dart'; import 'controller/picker_listener.dart'; import 'models/config.dart'; @@ -49,24 +51,25 @@ class GalleryPicker { {Config? config, bool startWithRecent = false, bool singleMedia = false, + PageTransitionType pageTransitionType = PageTransitionType.rightToLeft, List? initSelectedMedia, List? extraRecentMedia, required BuildContext context}) async { List? media; await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => GalleryPickerView( - onSelect: (mediaTmp) { - media = mediaTmp; - }, - config: config, - singleMedia: singleMedia, - initSelectedMedia: initSelectedMedia, - extraRecentMedia: extraRecentMedia, - startWithRecent: startWithRecent, - )), - ); + context, + PageTransition( + type: pageTransitionType, + child: GalleryPickerView( + onSelect: (mediaTmp) { + media = mediaTmp; + }, + config: config, + singleMedia: singleMedia, + initSelectedMedia: initSelectedMedia, + extraRecentMedia: extraRecentMedia, + startWithRecent: startWithRecent, + ))); return media; } @@ -77,24 +80,25 @@ class GalleryPicker { Widget Function(String tag, MediaFile media, BuildContext context)? heroBuilder, bool singleMedia = false, + PageTransitionType pageTransitionType = PageTransitionType.rightToLeft, List? initSelectedMedia, List? extraRecentMedia, bool startWithRecent = false, required BuildContext context}) async { await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => GalleryPickerView( - onSelect: (media) {}, - multipleMediaBuilder: multipleMediaBuilder, - heroBuilder: heroBuilder, - singleMedia: singleMedia, - config: config, - initSelectedMedia: initSelectedMedia, - extraRecentMedia: extraRecentMedia, - startWithRecent: startWithRecent, - )), - ); + context, + PageTransition( + type: pageTransitionType, + child: GalleryPickerView( + onSelect: (media) {}, + multipleMediaBuilder: multipleMediaBuilder, + heroBuilder: heroBuilder, + singleMedia: singleMedia, + config: config, + initSelectedMedia: initSelectedMedia, + extraRecentMedia: extraRecentMedia, + startWithRecent: startWithRecent, + ))); } static Future openSheet() async { @@ -103,9 +107,6 @@ class GalleryPicker { static Future closeSheet() async { BottomSheetPanel.close(); - if (GetInstance().isRegistered()) { - Get.find().resetBottomSheetView(); - } } static bool get isSheetOpened { diff --git a/lib/views/gallery_picker_view/gallery_picker_view.dart b/lib/views/gallery_picker_view/gallery_picker_view.dart index 951d7cb..bec8185 100644 --- a/lib/views/gallery_picker_view/gallery_picker_view.dart +++ b/lib/views/gallery_picker_view/gallery_picker_view.dart @@ -89,122 +89,133 @@ class _GalleryPickerState extends State { double width = MediaQuery.of(context).size.width; return GetBuilder(builder: (controller) { return GetInstance().isRegistered() - ? controller.permissionGranted + ? controller.permissionGranted != false ? PageView( controller: controller.pageController, physics: const NeverScrollableScrollPhysics(), children: [ - Scaffold( - backgroundColor: config.backgroundColor, - appBar: PickerAppBar( - controller: controller, - isBottomSheet: widget.isBottomSheet, - ), - body: Column( - children: [ - Container( - width: width, - height: 48, - color: config.appbarColor, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( - decoration: controller.isRecent - ? BoxDecoration( - border: Border( - bottom: BorderSide( - color: config.underlineColor, - width: 3.0, - ), - )) - : null, - height: 48, - width: width / 2, - child: TextButton( - onPressed: () { - controller.pickerPageController - .animateToPage(0, - duration: const Duration( - milliseconds: 50), - curve: Curves.easeIn); - setState(() { - controller.isRecent = true; - controller.switchPickerMode(false); - }); - }, - child: Text(config.recents, - style: controller.isRecent - ? config.selectedMenuStyle - : config.unselectedMenuStyle)), + WillPopScope( + child: Scaffold( + backgroundColor: config.backgroundColor, + appBar: PickerAppBar( + controller: controller, + isBottomSheet: widget.isBottomSheet, + ), + body: Column( + children: [ + Container( + width: width, + height: 48, + color: config.appbarColor, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Container( + decoration: controller.isRecent + ? BoxDecoration( + border: Border( + bottom: BorderSide( + color: config.underlineColor, + width: 3.0, + ), + )) + : null, + height: 48, + width: width / 2, + child: TextButton( + onPressed: () { + controller.pickerPageController + .animateToPage(0, + duration: const Duration( + milliseconds: 50), + curve: Curves.easeIn); + setState(() { + controller.isRecent = true; + controller + .switchPickerMode(false); + }); + }, + child: Text(config.recents, + style: controller.isRecent + ? config.selectedMenuStyle + : config + .unselectedMenuStyle)), + ), + Container( + decoration: !controller.isRecent + ? BoxDecoration( + border: Border( + bottom: BorderSide( + color: config.underlineColor, + width: 3.0, + ), + )) + : null, + height: 48, + width: width / 2, + child: TextButton( + onPressed: () { + controller.pickerPageController + .animateToPage(1, + duration: const Duration( + milliseconds: 50), + curve: Curves.easeIn); + controller.isRecent = false; + controller.switchPickerMode(false); + }, + child: Text( + config.gallery, + style: controller.isRecent + ? config.unselectedMenuStyle + : config.selectedMenuStyle, + )), + ) + ], ), - Container( - decoration: !controller.isRecent - ? BoxDecoration( - border: Border( - bottom: BorderSide( - color: config.underlineColor, - width: 3.0, - ), - )) - : null, - height: 48, - width: width / 2, - child: TextButton( - onPressed: () { - controller.pickerPageController - .animateToPage(1, - duration: const Duration( - milliseconds: 50), - curve: Curves.easeIn); + ), + Expanded( + child: PageView( + controller: controller.pickerPageController, + onPageChanged: (value) { + if (value == 0) { + controller.isRecent = true; + controller.switchPickerMode(false); + } else { controller.isRecent = false; controller.switchPickerMode(false); - }, - child: Text( - config.gallery, - style: controller.isRecent - ? config.unselectedMenuStyle - : config.selectedMenuStyle, - )), - ) - ], - ), + } + }, + scrollDirection: Axis.horizontal, + children: [ + controller.isInitialized && + controller.recent != null + ? AlbumMediasView( + galleryAlbum: controller.recent!, + controller: controller, + isBottomSheet: + widget.isBottomSheet, + singleMedia: widget.singleMedia) + : const Center( + child: CircularProgressIndicator( + color: Colors.grey, + )), + AlbumCategoriesView( + controller: controller, + isBottomSheet: widget.isBottomSheet, + singleMedia: widget.singleMedia, + ) + ]), + ), + ], ), - Expanded( - child: PageView( - controller: controller.pickerPageController, - onPageChanged: (value) { - if (value == 0) { - controller.isRecent = true; - controller.switchPickerMode(false); - } else { - controller.isRecent = false; - controller.switchPickerMode(false); - } - }, - scrollDirection: Axis.horizontal, - children: [ - controller.isInitialized && - controller.recent != null - ? AlbumMediasView( - galleryAlbum: controller.recent!, - controller: controller, - isBottomSheet: widget.isBottomSheet, - singleMedia: widget.singleMedia) - : const Center( - child: CircularProgressIndicator( - color: Colors.grey, - )), - AlbumCategoriesView( - controller: controller, - isBottomSheet: widget.isBottomSheet, - singleMedia: widget.singleMedia, - ) - ]), - ), - ], - ), - ), + ), + onWillPop: () async { + if (!widget.isBottomSheet) { + controller.disposeController(); + } + return true; + }), AlbumPage( album: controller.selectedAlbum, controller: controller, @@ -212,10 +223,12 @@ class _GalleryPickerState extends State { isBottomSheet: widget.isBottomSheet) ], ) - : controller.config.permissionDeniedPage ?? - PermissionDeniedView( - config: controller.config, - ) + : Material( + child: controller.config.permissionDeniedPage ?? + PermissionDeniedView( + config: controller.config, + ), + ) : ReloadGallery( config, onpressed: () async { diff --git a/lib/views/picker_scaffold.dart b/lib/views/picker_scaffold.dart index 89778aa..16ffc80 100644 --- a/lib/views/picker_scaffold.dart +++ b/lib/views/picker_scaffold.dart @@ -109,6 +109,19 @@ class PickerScaffold extends StatelessWidget { backgroundColor: backgroundColor, bottomNavigationBar: bottomNavigationBar, body: body, + onWillPop: () async { + if (BottomSheetPanel.isOpen) { + if (GetInstance().isRegistered() && + Get.find().selectedAlbum != null) { + Get.find().backToPicker(); + } else { + BottomSheetPanel.close(); + } + return false; + } else { + return true; + } + }, bottomSheet: DraggableBottomSheet( draggableBody: true, maxHeight: MediaQuery.of(context).size.height, diff --git a/pubspec.yaml b/pubspec.yaml index f05c0c1..6dd67c1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: gallery_picker description: Gallery Picker is a flutter package that will allow you to pick media file(s), manage and navigate inside your gallery with modern tools and views. -version: 0.3.1 +version: 0.3.2 homepage: https://github.com/FlutterWay/gallery_picker environment: @@ -18,7 +18,8 @@ dependencies: get: ^4.6.5 video_thumbnail: ^0.5.3 intl: ^0.18.0 - bottom_sheet_scaffold: ^0.1.1 + page_transition: ^2.0.9 + bottom_sheet_scaffold: ^0.1.2 dev_dependencies: flutter_test: sdk: flutter