Added auto close slidable

This commit is contained in:
Juan Gilsanz Polo
2024-02-26 10:46:45 +01:00
parent a3bbdd6198
commit e127f00762
5 changed files with 82 additions and 69 deletions

View File

@@ -1,3 +1,4 @@
class ConfigOptions { class ConfigOptions {
static const int listLimit = 20; static const int listLimit = 20;
static const String slidableGroupTag = "bookmarksSlidable";
} }

View File

@@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:linkdy/screens/bookmarks/provider/favicon_loader.provider.dart'; import 'package:linkdy/screens/bookmarks/provider/favicon_loader.provider.dart';
import 'package:linkdy/config/options.dart';
import 'package:linkdy/i18n/strings.g.dart'; import 'package:linkdy/i18n/strings.g.dart';
import 'package:linkdy/models/data/bookmarks.dart'; import 'package:linkdy/models/data/bookmarks.dart';
import 'package:linkdy/providers/app_status.provider.dart'; import 'package:linkdy/providers/app_status.provider.dart';
@@ -40,6 +41,8 @@ class BookmarkItem extends ConsumerWidget {
} }
return Slidable( return Slidable(
key: ValueKey(bookmark.id!),
groupTag: ConfigOptions.slidableGroupTag,
startActionPane: ActionPane( startActionPane: ActionPane(
motion: const DrawerMotion(), motion: const DrawerMotion(),
extentRatio: 0.5, extentRatio: 0.5,

View File

@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:linkdy/constants/enums.dart'; import 'package:linkdy/constants/enums.dart';
import 'package:linkdy/screens/bookmarks/provider/bookmarks.provider.dart'; import 'package:linkdy/screens/bookmarks/provider/bookmarks.provider.dart';
@@ -106,34 +107,36 @@ class BookmarksScreen extends ConsumerWidget {
), ),
), ),
if (bookmarks.bookmarks.isNotEmpty) if (bookmarks.bookmarks.isNotEmpty)
SliverList.builder( SlidableAutoCloseBehavior(
itemCount: bookmarks.bookmarks.length + 1, child: SliverList.builder(
itemBuilder: (context, index) { itemCount: bookmarks.bookmarks.length + 1,
// index == bookmarks.value!.content!.results!.length -> itemCount + 1 itemBuilder: (context, index) {
if (index == bookmarks.bookmarks.length) { // index == bookmarks.value!.content!.results!.length -> itemCount + 1
if (bookmarks.loadingMore) { if (index == bookmarks.bookmarks.length) {
return const SizedBox( if (bookmarks.loadingMore) {
height: 80, return const SizedBox(
child: Center( height: 80,
child: CircularProgressIndicator(), child: Center(
), child: CircularProgressIndicator(),
); ),
);
}
// Bottom gap for FAB
return const SizedBox(height: 80);
} }
// Bottom gap for FAB return BookmarkItem(
return const SizedBox(height: 80); bookmark: bookmarks.bookmarks[index],
} onReadUnread: ref.read(bookmarksProvider.notifier).markAsReadUnread,
return BookmarkItem( onDelete: (bookmark) => showDialog(
bookmark: bookmarks.bookmarks[index], context: context,
onReadUnread: ref.read(bookmarksProvider.notifier).markAsReadUnread, builder: (context) => DeleteBookmarkModal(
onDelete: (bookmark) => showDialog( bookmark: bookmark,
context: context, onDelete: ref.read(bookmarksProvider.notifier).deleteBookmark,
builder: (context) => DeleteBookmarkModal( ),
bookmark: bookmark,
onDelete: ref.read(bookmarksProvider.notifier).deleteBookmark,
), ),
), );
); },
}, ),
), ),
], ],
), ),

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:linkdy/screens/bookmarks/provider/search_bookmarks.provider.dart'; import 'package:linkdy/screens/bookmarks/provider/search_bookmarks.provider.dart';
import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart'; import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart';
@@ -101,29 +102,31 @@ class SearchBookmarksScreen extends ConsumerWidget {
return NotificationListener( return NotificationListener(
onNotification: scrollListener, onNotification: scrollListener,
child: ListView.builder( child: SlidableAutoCloseBehavior(
itemCount: provider.loadingMore ? provider.bookmarks.length + 1 : provider.bookmarks.length, child: ListView.builder(
itemBuilder: (context, index) { itemCount: provider.loadingMore ? provider.bookmarks.length + 1 : provider.bookmarks.length,
if (provider.loadingMore == true && index == provider.bookmarks.length) { itemBuilder: (context, index) {
return const Padding( if (provider.loadingMore == true && index == provider.bookmarks.length) {
padding: EdgeInsets.all(16), return const Padding(
child: Center( padding: EdgeInsets.all(16),
child: CircularProgressIndicator(), child: Center(
child: CircularProgressIndicator(),
),
);
}
return BookmarkItem(
bookmark: provider.bookmarks[index],
onReadUnread: ref.read(searchBookmarksProvider.notifier).markAsReadUnread,
onDelete: (bookmark) => showDialog(
context: context,
builder: (context) => DeleteBookmarkModal(
bookmark: bookmark,
onDelete: ref.read(searchBookmarksProvider.notifier).deleteBookmark,
),
), ),
); );
} },
return BookmarkItem( ),
bookmark: provider.bookmarks[index],
onReadUnread: ref.read(searchBookmarksProvider.notifier).markAsReadUnread,
onDelete: (bookmark) => showDialog(
context: context,
builder: (context) => DeleteBookmarkModal(
bookmark: bookmark,
onDelete: ref.read(searchBookmarksProvider.notifier).deleteBookmark,
),
),
);
},
), ),
); );
}, },

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart'; import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart';
import 'package:linkdy/screens/bookmarks/ui/delete_bookmark_modal.dart'; import 'package:linkdy/screens/bookmarks/ui/delete_bookmark_modal.dart';
@@ -115,30 +116,32 @@ class TagBookmarksScreenState extends ConsumerState<TagBookmarksScreen> {
), ),
), ),
if (provider.bookmarks.isNotEmpty) if (provider.bookmarks.isNotEmpty)
SliverList.builder( SlidableAutoCloseBehavior(
itemCount: child: SliverList.builder(
provider.loadingMore == true ? provider.bookmarks.length + 1 : provider.bookmarks.length, itemCount:
itemBuilder: (context, index) { provider.loadingMore == true ? provider.bookmarks.length + 1 : provider.bookmarks.length,
if (provider.loadingMore == true && index == provider.bookmarks.length) { itemBuilder: (context, index) {
return const Padding( if (provider.loadingMore == true && index == provider.bookmarks.length) {
padding: EdgeInsets.all(16), return const Padding(
child: Center( padding: EdgeInsets.all(16),
child: CircularProgressIndicator(), child: Center(
child: CircularProgressIndicator(),
),
);
}
return BookmarkItem(
bookmark: provider.bookmarks[index],
onReadUnread: ref.read(tagBookmarksProvider.notifier).markAsReadUnread,
onDelete: (bookmark) => showDialog(
context: context,
builder: (context) => DeleteBookmarkModal(
bookmark: bookmark,
onDelete: ref.read(tagBookmarksProvider.notifier).deleteBookmark,
),
), ),
); );
} },
return BookmarkItem( ),
bookmark: provider.bookmarks[index],
onReadUnread: ref.read(tagBookmarksProvider.notifier).markAsReadUnread,
onDelete: (bookmark) => showDialog(
context: context,
builder: (context) => DeleteBookmarkModal(
bookmark: bookmark,
onDelete: ref.read(tagBookmarksProvider.notifier).deleteBookmark,
),
),
);
},
), ),
], ],
), ),