mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 10:52:05 +00:00
library searchBar and favorite manga view
This commit is contained in:
parent
4fe506fa44
commit
fc0a46c82b
2 changed files with 178 additions and 13 deletions
|
|
@ -1,23 +1,86 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/providers/hive_provider.dart';
|
||||
import 'package:mangayomi/utils/cached_network.dart';
|
||||
import 'package:mangayomi/views/general/scroll_controller_provider.dart';
|
||||
import 'package:mangayomi/views/widgets/bottom_text_widget.dart';
|
||||
import 'package:mangayomi/views/widgets/cover_view_widget.dart';
|
||||
import 'package:mangayomi/views/widgets/gridview_widget.dart';
|
||||
|
||||
class LibraryScreen extends StatelessWidget {
|
||||
class LibraryScreen extends ConsumerStatefulWidget {
|
||||
const LibraryScreen({super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<LibraryScreen> createState() => _LibraryScreenState();
|
||||
}
|
||||
|
||||
class _LibraryScreenState extends ConsumerState<LibraryScreen> {
|
||||
bool isSearch = false;
|
||||
List<ModelManga> entries = [];
|
||||
List<ModelManga> entriesFilter = [];
|
||||
final _textEditingController = TextEditingController();
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final scrollController = ref.watch(scrollControllerProvider);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.transparent,
|
||||
title: Text(
|
||||
'Library',
|
||||
style: TextStyle(color: Theme.of(context).hintColor),
|
||||
),
|
||||
title: isSearch
|
||||
? null
|
||||
: Text(
|
||||
'Library',
|
||||
style: TextStyle(color: Theme.of(context).hintColor),
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {},
|
||||
icon: Icon(Icons.search, color: Theme.of(context).hintColor)),
|
||||
isSearch
|
||||
? Flexible(
|
||||
child: TextFormField(
|
||||
style: const TextStyle(fontFamily: 'Lato'),
|
||||
controller: _textEditingController,
|
||||
keyboardType: TextInputType.text,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
entriesFilter = entries
|
||||
.where((element) =>
|
||||
element.name!.toLowerCase().contains(value))
|
||||
.toList();
|
||||
});
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Seach...',
|
||||
filled: true,
|
||||
fillColor: Colors.transparent,
|
||||
prefixIcon: IconButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
isSearch = false;
|
||||
});
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back,
|
||||
)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide: BorderSide.none)),
|
||||
),
|
||||
)
|
||||
: IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
isSearch = true;
|
||||
});
|
||||
},
|
||||
icon: Icon(Icons.search, color: Theme.of(context).hintColor)),
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {},
|
||||
|
|
@ -27,10 +90,7 @@ class LibraryScreen extends StatelessWidget {
|
|||
color: Theme.of(context).hintColor,
|
||||
itemBuilder: (context) {
|
||||
return [
|
||||
const PopupMenuItem<int>(
|
||||
value: 0,
|
||||
child: Text("1"),
|
||||
),
|
||||
const PopupMenuItem<int>(value: 0, child: Text("1")),
|
||||
const PopupMenuItem<int>(
|
||||
value: 1,
|
||||
child: Text("2"),
|
||||
|
|
@ -48,6 +108,90 @@ class LibraryScreen extends StatelessWidget {
|
|||
}),
|
||||
],
|
||||
),
|
||||
body: _textEditingController.text.isNotEmpty
|
||||
? GridViewWidget(
|
||||
controller: scrollController,
|
||||
itemCount: entriesFilter.length,
|
||||
itemBuilder: (context, index) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
final model = ModelManga(
|
||||
imageUrl: entriesFilter[index].imageUrl,
|
||||
name: entriesFilter[index].name,
|
||||
genre: entriesFilter[index].genre,
|
||||
author: entriesFilter[index].author,
|
||||
status: entriesFilter[index].status,
|
||||
chapterDate: entriesFilter[index].chapterDate,
|
||||
chapterTitle: entriesFilter[index].chapterTitle,
|
||||
chapterUrl: entriesFilter[index].chapterUrl,
|
||||
description: entriesFilter[index].description,
|
||||
favorite: entriesFilter[index].favorite,
|
||||
link: entriesFilter[index].link,
|
||||
source: entriesFilter[index].source,
|
||||
lang: entriesFilter[index].lang);
|
||||
|
||||
context.push('/manga-reader/detail', extra: model);
|
||||
},
|
||||
child: CoverViewWidget(
|
||||
children: [
|
||||
cachedNetworkImage(
|
||||
imageUrl: entriesFilter[index].imageUrl!,
|
||||
width: 200,
|
||||
height: 270,
|
||||
fit: BoxFit.cover),
|
||||
BottomTextWidget(text: entriesFilter[index].name!)
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
)
|
||||
: ValueListenableBuilder<Box<ModelManga>>(
|
||||
valueListenable: ref.watch(hiveBoxManga).listenable(),
|
||||
builder: (context, value, child) {
|
||||
entries =
|
||||
value.values.where((element) => element.favorite).toList();
|
||||
|
||||
if (entries.isNotEmpty) {
|
||||
return GridViewWidget(
|
||||
controller: scrollController,
|
||||
itemCount: entries.length,
|
||||
itemBuilder: (context, index) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
final model = ModelManga(
|
||||
imageUrl: entries[index].imageUrl,
|
||||
name: entries[index].name,
|
||||
genre: entries[index].genre,
|
||||
author: entries[index].author,
|
||||
status: entries[index].status,
|
||||
chapterDate: entries[index].chapterDate,
|
||||
chapterTitle: entries[index].chapterTitle,
|
||||
chapterUrl: entries[index].chapterUrl,
|
||||
description: entries[index].description,
|
||||
favorite: entries[index].favorite,
|
||||
link: entries[index].link,
|
||||
source: entries[index].source,
|
||||
lang: entries[index].lang);
|
||||
|
||||
context.push('/manga-reader/detail', extra: model);
|
||||
},
|
||||
child: CoverViewWidget(
|
||||
children: [
|
||||
cachedNetworkImage(
|
||||
imageUrl: entries[index].imageUrl!,
|
||||
width: 200,
|
||||
height: 270,
|
||||
fit: BoxFit.cover),
|
||||
BottomTextWidget(text: entries[index].name!)
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
return const Center(child: Text("Empty Library"));
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
21
lib/views/library/serch.dart
Normal file
21
lib/views/library/serch.dart
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class SeachWi extends StatefulWidget {
|
||||
const SeachWi({super.key});
|
||||
|
||||
@override
|
||||
State<SeachWi> createState() => _SeachWiState();
|
||||
}
|
||||
|
||||
class _SeachWiState extends State<SeachWi> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return PreferredSize(
|
||||
child: AppBar(
|
||||
title: Row(
|
||||
children: [],
|
||||
),
|
||||
),
|
||||
preferredSize: Size.fromHeight(AppBar().preferredSize.height));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue