This commit is contained in:
kodjodevf 2023-04-20 18:03:22 +01:00
parent 83d8e2940c
commit 3ff0715f4d
15 changed files with 230 additions and 269 deletions

View file

@ -5,7 +5,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<application
android:label="mangayomi"
android:label="Mangayomi"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
<activity

View file

@ -13,7 +13,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>mangayomi</string>
<string>Mangayomi</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>

View file

@ -11,6 +11,7 @@ import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/services/get_popular_manga.dart';
import 'package:mangayomi/services/http_res_to_dom_html.dart';
import 'package:mangayomi/source/source_model.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_js/flutter_js.dart';
@ -19,7 +20,9 @@ part 'get_manga_chapter_url.g.dart';
class GetMangaChapterUrlModel {
Directory? path;
List urll = [];
GetMangaChapterUrlModel({required this.path, required this.urll});
List<bool> isLocaleList = [];
GetMangaChapterUrlModel(
{required this.path, required this.urll, required this.isLocaleList});
}
@riverpod
@ -30,6 +33,7 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
}) async {
Directory? path;
List urll = [];
List<bool> isLocaleList = [];
String source = modelManga.source!.toLowerCase();
List pagesUrl = ref.watch(hiveBoxMangaInfo).get(
"${modelManga.lang}-${modelManga.source}/${modelManga.name}/${modelManga.chapters![index].name}-pageurl",
@ -130,7 +134,8 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
/***********/
else if (modelManga.source == 'mangakawaii') {
final response = await http.get(Uri.parse(modelManga.chapters![index].url!));
final response =
await http.get(Uri.parse(modelManga.chapters![index].url!));
var chapterSlug = RegExp("""var chapter_slug = "([^"]*)";""")
.allMatches(response.body.toString())
.last
@ -307,6 +312,16 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
}
}
}
if (urll.isNotEmpty) {
for (var i = 0; i < urll.length; i++) {
if (await File("${path!.path}" "${padIndex(i + 1)}.jpg").exists()) {
isLocaleList.add(true);
} else {
isLocaleList.add(false);
}
}
}
return GetMangaChapterUrlModel(path: path, urll: urll);
return GetMangaChapterUrlModel(
path: path, urll: urll, isLocaleList: isLocaleList);
}

View file

@ -196,7 +196,7 @@ Future<GetMangaModel> getPopularManga(GetPopularMangaRef ref,
' body > div.container.weekrank.ranking > div > div > ul > li > a > img')
.where((e) => e.attributes.containsKey('src'))
.where((e) => e.attributes['src']!.contains("cover"))
.map((e) => e.attributes['src'])
.map((e) => e.attributes['src']!.split('?').first)
.toList();
name = dom

View file

@ -1,4 +1,8 @@
import 'dart:developer';
Map<String, String> headers(String source) {
source = source.toLowerCase();
log(source);
return source == 'mangakawaii'
? {
'Referer': 'https://www.mangakawaii.io/',

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
@ -6,16 +8,16 @@ import 'package:mangayomi/utils/colors.dart';
import 'package:mangayomi/utils/media_query.dart';
import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart';
class GeneralScreen extends ConsumerStatefulWidget {
class GeneralScreen extends StatefulWidget {
const GeneralScreen({super.key, required this.child});
final Widget child;
@override
ConsumerState<GeneralScreen> createState() => _GeneralScreenState();
State<GeneralScreen> createState() => _GeneralScreenState();
}
class _GeneralScreenState extends ConsumerState<GeneralScreen> {
class _GeneralScreenState extends State<GeneralScreen> {
@override
Widget build(BuildContext context) {
final route = GoRouter.of(context);
@ -36,8 +38,11 @@ class _GeneralScreenState extends ConsumerState<GeneralScreen> {
final incognitoMode = ref.watch(incognitoModeStateProvider);
return Material(
child: AnimatedContainer(
height:
incognitoMode ? MediaQuery.of(context).padding.top * 2 : 0,
height: incognitoMode
? Platform.isAndroid || Platform.isIOS
? MediaQuery.of(context).padding.top * 2
: 50
: 0,
curve: Curves.easeIn,
duration: const Duration(milliseconds: 150),
color: generalColor(context),

View file

@ -211,7 +211,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
controller: _scrollController,
child: ListView.builder(
controller: _scrollController,
padding: const EdgeInsets.only(top: 0),
padding: const EdgeInsets.only(top: 0, bottom: 60),
itemCount: widget.listLength,
itemBuilder: (context, index) {
int finalIndex = index - 1;

View file

@ -81,9 +81,12 @@ class ChapterListTileWidget extends ConsumerWidget {
color: generalColor(context),
)
: Container(),
Text(
chapters[finalIndex].name!,
style: const TextStyle(fontSize: 13),
Flexible(
child: Text(
chapters[finalIndex].name!,
style: const TextStyle(fontSize: 13),
overflow: TextOverflow.ellipsis,
),
),
],
),

View file

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:mangayomi/utils/headers.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
class ImageViewHorizontal extends StatefulWidget {
class ImageViewHorizontal extends StatelessWidget {
final int length;
final String url;
final int index;
@ -12,6 +12,7 @@ class ImageViewHorizontal extends StatefulWidget {
final String source;
final String chapter;
final Directory path;
final bool isLocale;
final Widget? Function(ExtendedImageState state) loadStateChanged;
final Function(ExtendedImageGestureState state) onDoubleTap;
final GestureConfig Function(ExtendedImageState state)
@ -28,70 +29,33 @@ class ImageViewHorizontal extends StatefulWidget {
required this.loadStateChanged,
required this.onDoubleTap,
required this.initGestureConfigHandler,
required this.isLocale,
});
@override
State createState() => _ImageViewHorizontalState();
}
typedef DoubleClickAnimationListener = void Function();
class _ImageViewHorizontalState extends State<ImageViewHorizontal> {
@override
void initState() {
_localCheck();
super.initState();
}
_localCheck() async {
if (await File("${widget.path.path}" "${padIndex(widget.index + 1)}.jpg")
.exists()) {
if (mounted) {
setState(() {
_isLocale = true;
_isLoading = false;
});
}
} else {
if (mounted) {
setState(() {
_isLocale = false;
_isLoading = false;
});
}
}
}
bool _isLoading = true;
bool _isLocale = false;
@override
Widget build(BuildContext context) {
return _isLoading
? const Center(
child: CircularProgressIndicator(),
return isLocale
? ExtendedImage.file(
File("${path.path}" "${padIndex(index + 1)}.jpg"),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: initGestureConfigHandler,
onDoubleTap: onDoubleTap,
loadStateChanged: loadStateChanged,
)
: _isLocale
? ExtendedImage.file(
File("${widget.path.path}" "${padIndex(widget.index + 1)}.jpg"),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: widget.initGestureConfigHandler,
onDoubleTap: widget.onDoubleTap,
loadStateChanged: widget.loadStateChanged,
)
: ExtendedImage.network(
widget.url,
cache: true,
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
cacheMaxAge: const Duration(days: 7),
headers: headers(widget.source),
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: widget.initGestureConfigHandler,
onDoubleTap: widget.onDoubleTap,
handleLoadingProgress: true,
loadStateChanged: widget.loadStateChanged,
);
: ExtendedImage.network(
url,
cache: true,
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
cacheMaxAge: const Duration(days: 7),
headers: headers(source),
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: initGestureConfigHandler,
onDoubleTap: onDoubleTap,
handleLoadingProgress: true,
loadStateChanged: loadStateChanged,
);
}
}

View file

@ -7,9 +7,9 @@ import 'package:mangayomi/utils/headers.dart';
import 'package:mangayomi/utils/media_query.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
class ImageViewVertical extends ConsumerStatefulWidget {
class ImageViewVertical extends StatelessWidget {
final int length;
final bool isLocale;
final String url;
final int index;
final String titleManga;
@ -17,142 +17,99 @@ class ImageViewVertical extends ConsumerStatefulWidget {
final String chapter;
final Directory path;
const ImageViewVertical(
{super.key,
required this.url,
required this.chapter,
required this.index,
required this.path,
required this.titleManga,
required this.source,
required this.length});
const ImageViewVertical({
super.key,
required this.url,
required this.chapter,
required this.index,
required this.path,
required this.titleManga,
required this.source,
required this.length,
required this.isLocale,
});
@override
ConsumerState createState() => _ImageViewVerticalState();
}
class _ImageViewVerticalState extends ConsumerState<ImageViewVertical>
with AutomaticKeepAliveClientMixin<ImageViewVertical> {
@override
void initState() {
_localCheck();
super.initState();
}
_localCheck() async {
if (await File("${widget.path.path}" "${padIndex(widget.index + 1)}.jpg")
.exists()) {
if (mounted) {
setState(() {
_isLocale = true;
_isLoading = false;
});
}
} else {
if (mounted) {
setState(() {
_isLocale = false;
_isLoading = false;
});
}
}
}
bool _isLoading = true;
bool _isLocale = false;
@override
Widget build(BuildContext context) {
super.build(context);
return Container(
color: Colors.black,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (widget.index == 0)
if (index == 0)
SizedBox(
height: MediaQuery.of(context).padding.top,
),
_isLoading
? SizedBox(
height: mediaHeight(context, 0.8),
child: const Center(
child: SizedBox(
height: 35,
width: 35,
child: CircularProgressIndicator()),
),
)
: _isLocale
? ExtendedImage.file(
fit: BoxFit.contain,
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
File(
'${widget.path.path}${padIndex(widget.index + 1)}.jpg'))
: ExtendedImage.network(widget.url,
headers: headers(widget.source),
handleLoadingProgress: true,
fit: BoxFit.contain,
cacheMaxAge: const Duration(days: 7),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
loadStateChanged: (ExtendedImageState state) {
if (state.extendedImageLoadState == LoadState.loading) {
final ImageChunkEvent? loadingProgress =
state.loadingProgress;
final double progress =
loadingProgress?.expectedTotalBytes != null
? loadingProgress!.cumulativeBytesLoaded /
loadingProgress.expectedTotalBytes!
: 0;
return TweenAnimationBuilder<double>(
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
tween: Tween<double>(
begin: 0,
end: progress,
),
builder: (context, value, _) => Container(
color: Colors.black,
height: mediaHeight(context, 0.8),
child: Center(
child: progress == 0
? const CircularProgressIndicator()
: CircularProgressIndicator(
value: progress,
),
),
),
);
}
if (state.extendedImageLoadState == LoadState.failed) {
return Container(
color: Colors.black,
height: mediaHeight(context, 0.8),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
state.reLoadImage();
},
child: const Icon(
Icons.replay_outlined,
size: 30,
)),
],
));
}
return null;
}),
if (widget.index + 1 == widget.length)
isLocale
? ExtendedImage.file(
fit: BoxFit.contain,
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
File('${path.path}${padIndex(index + 1)}.jpg'))
: ExtendedImage.network(url,
headers: headers(source),
handleLoadingProgress: true,
fit: BoxFit.contain,
cacheMaxAge: const Duration(days: 7),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
loadStateChanged: (ExtendedImageState state) {
if (state.extendedImageLoadState == LoadState.loading) {
final ImageChunkEvent? loadingProgress =
state.loadingProgress;
final double progress =
loadingProgress?.expectedTotalBytes != null
? loadingProgress!.cumulativeBytesLoaded /
loadingProgress.expectedTotalBytes!
: 0;
return TweenAnimationBuilder<double>(
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
tween: Tween<double>(
begin: 0,
end: progress,
),
builder: (context, value, _) => Container(
color: Colors.black,
height: mediaHeight(context, 0.8),
child: Center(
child: progress == 0
? const CircularProgressIndicator()
: CircularProgressIndicator(
value: progress,
),
),
),
);
}
if (state.extendedImageLoadState == LoadState.failed) {
return Container(
color: Colors.black,
height: mediaHeight(context, 0.8),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
state.reLoadImage();
},
child: const Icon(
Icons.replay_outlined,
size: 30,
)),
],
));
}
return null;
}),
if (index + 1 == length)
SizedBox(
height: mediaHeight(context, 0.3),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'${widget.chapter} finished',
'$chapter finished',
style: const TextStyle(
fontSize: 17.0,
fontWeight: FontWeight.bold,

View file

@ -20,6 +20,8 @@ import 'package:photo_view/photo_view_gallery.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:collection/collection.dart';
typedef DoubleClickAnimationListener = void Function();
class MangaReaderView extends ConsumerWidget {
final MangaReaderModel mangaReaderModel;
const MangaReaderView({
@ -43,6 +45,7 @@ class MangaReaderView extends ConsumerWidget {
path: data.path!,
url: data.urll,
readerController: readerController,
isLocaleList: data.isLocaleList,
);
},
error: (error, stackTrace) => Scaffold(
@ -104,10 +107,12 @@ class MangaChapterPageGallery extends ConsumerStatefulWidget {
{super.key,
required this.path,
required this.url,
required this.readerController});
required this.readerController,
required this.isLocaleList});
final ReaderController readerController;
final Directory path;
final List url;
final List<bool> isLocaleList;
@override
ConsumerState createState() {
@ -122,7 +127,7 @@ class _MangaChapterPageGalleryState
ItemScrollController();
late AnimationController _scaleAnimationController;
late Animation<double> _animation;
late int _currentIndex = widget.readerController.getPageIndex();
@override
void dispose() {
_rebuildDetail.close();
@ -157,10 +162,9 @@ class _MangaChapterPageGalleryState
void _onPageChanged(int index) {
widget.readerController.setMangaHistoryUpdate();
if (mounted) {
ref
.read(currentIndexProvider(widget.readerController.mangaReaderModel)
.notifier)
.setCurrentIndex(index);
setState(() {
_currentIndex = index;
});
if (_imageDetailY != 0) {
_imageDetailY = 0;
_rebuildDetail.sink.add(_imageDetailY);
@ -174,10 +178,16 @@ class _MangaChapterPageGalleryState
if (_selectedValue == ReaderMode.verticalContinuous ||
_selectedValue == ReaderMode.webtoon) {
if (index != -1) {
_itemScrollController.scrollTo(
curve: Curves.ease,
if (isSlide) {
_itemScrollController.jumpTo(
index: index,
duration: Duration(milliseconds: isSlide ? 2 : 150));
);
} else {
_itemScrollController.scrollTo(
curve: Curves.ease,
index: index,
duration: Duration(milliseconds: isSlide ? 2 : 150));
}
}
} else {
if (index != -1) {
@ -192,10 +202,16 @@ class _MangaChapterPageGalleryState
if (_selectedValue == ReaderMode.verticalContinuous ||
_selectedValue == ReaderMode.webtoon) {
if (widget.readerController.getPageLength(widget.url) != index) {
_itemScrollController.scrollTo(
curve: Curves.ease,
if (isSlide) {
_itemScrollController.jumpTo(
index: index,
duration: Duration(milliseconds: isSlide ? 2 : 150));
);
} else {
_itemScrollController.scrollTo(
curve: Curves.ease,
index: index,
duration: Duration(milliseconds: isSlide ? 2 : 150));
}
}
} else {
if (widget.readerController.getPageLength(widget.url) != index) {
@ -235,10 +251,9 @@ class _MangaChapterPageGalleryState
void _recordReadProgress(int index) {
widget.readerController.setMangaHistoryUpdate();
if (mounted) {
ref
.read(currentIndexProvider(widget.readerController.mangaReaderModel)
.notifier)
.setCurrentIndex(index);
setState(() {
_currentIndex = index;
});
}
widget.readerController.setPageIndex(index);
}
@ -261,7 +276,7 @@ class _MangaChapterPageGalleryState
}
late final _extendedController = ExtendedPageController(
initialPage: widget.readerController.getPageIndex(),
initialPage: _currentIndex,
shouldIgnorePointerWhenScrolling: false,
);
double get pixelRatio => ui.window.devicePixelRatio;
@ -315,8 +330,7 @@ class _MangaChapterPageGalleryState
if (isInit) {
await Future.delayed(const Duration(milliseconds: 30));
}
_extendedController.jumpToPage(ref.watch(
currentIndexProvider(widget.readerController.mangaReaderModel)));
_extendedController.jumpToPage(_currentIndex);
}
} else if (value == ReaderMode.ltr || value == ReaderMode.rtl) {
if (mounted) {
@ -332,8 +346,7 @@ class _MangaChapterPageGalleryState
if (isInit) {
await Future.delayed(const Duration(milliseconds: 30));
}
_extendedController.jumpToPage(ref.watch(
currentIndexProvider(widget.readerController.mangaReaderModel)));
_extendedController.jumpToPage(_currentIndex);
}
} else {
if (mounted) {
@ -345,9 +358,7 @@ class _MangaChapterPageGalleryState
await Future.delayed(const Duration(milliseconds: 30));
}
_itemScrollController.scrollTo(
index: ref.watch(
currentIndexProvider(widget.readerController.mangaReaderModel)),
duration: const Duration(milliseconds: 1));
index: _currentIndex, duration: const Duration(milliseconds: 1));
}
}
}
@ -460,7 +471,7 @@ class _MangaChapterPageGalleryState
Padding(
padding: const EdgeInsets.only(left: 12),
child: Text(
"${ref.watch(currentIndexProvider(widget.readerController.mangaReaderModel)) + 1} ",
"${_currentIndex + 1} ",
style: const TextStyle(
fontSize: 15.0,
fontWeight: FontWeight.bold,
@ -492,11 +503,7 @@ class _MangaChapterPageGalleryState
.getPageLength(widget.url) -
1,
1),
value: ref
.watch(currentIndexProvider(widget
.readerController
.mangaReaderModel))
.toDouble(),
value: _currentIndex.toDouble(),
min: 0,
max: (widget.readerController
.getPageLength(widget.url) -
@ -509,7 +516,7 @@ class _MangaChapterPageGalleryState
Padding(
padding: const EdgeInsets.only(right: 12),
child: Text(
"${ref.watch(currentIndexProvider(widget.readerController.mangaReaderModel)) + 1} ",
"${_currentIndex + 1} ",
style: const TextStyle(
fontSize: 15.0,
fontWeight: FontWeight.bold,
@ -647,7 +654,7 @@ class _MangaChapterPageGalleryState
? Align(
alignment: Alignment.bottomCenter,
child: Text(
'${ref.watch(currentIndexProvider(widget.readerController.mangaReaderModel)) + 1} / ${widget.readerController.getPageLength(widget.url)}',
'${_currentIndex + 1} / ${widget.readerController.getPageLength(widget.url)}',
style: const TextStyle(
fontSize: 12.0,
color: Colors.white,
@ -681,8 +688,6 @@ class _MangaChapterPageGalleryState
Widget _gestureRightLeft() {
return Consumer(
builder: (context, ref, child) {
final currentIndex = ref.watch(
currentIndexProvider(widget.readerController.mangaReaderModel));
return Row(
children: [
/// left region
@ -693,9 +698,9 @@ class _MangaChapterPageGalleryState
behavior: HitTestBehavior.translucent,
onTap: () {
if (_isReversHorizontal) {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
} else {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
}
},
onDoubleTapDown: (TapDownDetails details) {
@ -710,9 +715,9 @@ class _MangaChapterPageGalleryState
behavior: HitTestBehavior.translucent,
onTap: () {
if (_isReversHorizontal) {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
} else {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
}
},
),
@ -751,9 +756,9 @@ class _MangaChapterPageGalleryState
behavior: HitTestBehavior.translucent,
onTap: () {
if (_isReversHorizontal) {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
} else {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
}
},
onDoubleTapDown: (TapDownDetails details) {
@ -768,9 +773,9 @@ class _MangaChapterPageGalleryState
behavior: HitTestBehavior.translucent,
onTap: () {
if (_isReversHorizontal) {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
} else {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
}
},
),
@ -784,8 +789,6 @@ class _MangaChapterPageGalleryState
Widget _gestureTopBottom() {
return Consumer(
builder: (context, ref, child) {
final currentIndex = ref.watch(
currentIndexProvider(widget.readerController.mangaReaderModel));
return Column(
children: [
/// top region
@ -795,7 +798,7 @@ class _MangaChapterPageGalleryState
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
},
onDoubleTapDown: (TapDownDetails details) {
_toggleScale(details.globalPosition);
@ -808,7 +811,7 @@ class _MangaChapterPageGalleryState
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
_onAddButtonTapped(currentIndex - 1, true);
_onAddButtonTapped(_currentIndex - 1, true);
},
),
),
@ -823,7 +826,7 @@ class _MangaChapterPageGalleryState
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
},
onDoubleTapDown: (TapDownDetails details) {
_toggleScale(details.globalPosition);
@ -836,7 +839,7 @@ class _MangaChapterPageGalleryState
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
_onAddButtonTapped(currentIndex + 1, false);
_onAddButtonTapped(_currentIndex + 1, false);
},
),
),
@ -885,8 +888,7 @@ class _MangaChapterPageGalleryState
child: ScrollablePositionedList.separated(
physics: const ClampingScrollPhysics(),
minCacheExtent: 8 * (MediaQuery.of(context).size.height),
initialScrollIndex:
widget.readerController.getPageIndex(),
initialScrollIndex: _currentIndex,
itemCount:
widget.readerController.getPageLength(widget.url),
itemScrollController: _itemScrollController,
@ -899,13 +901,18 @@ class _MangaChapterPageGalleryState
onDoubleTap: () {},
child: ImageViewVertical(
titleManga: widget.readerController.getMangaName(),
source: widget.readerController.getSourceName(),
source: widget.readerController
.getSourceName()
.replaceAll(
'${widget.readerController.mangaReaderModel.modelManga.lang}-',
''),
index: index,
url: widget.url[index],
path: widget.path,
chapter: widget.readerController.getChapterTitle(),
length:
widget.readerController.getPageLength(widget.url),
isLocale: widget.isLocaleList[index],
),
),
separatorBuilder: (_, __) => Divider(
@ -930,7 +937,11 @@ class _MangaChapterPageGalleryState
itemBuilder: (BuildContext context, int index) {
return ImageViewHorizontal(
titleManga: widget.readerController.getMangaName(),
source: widget.readerController.getSourceName(),
source: widget.readerController
.getSourceName()
.replaceAll(
'${widget.readerController.mangaReaderModel.modelManga.lang}-',
''),
index: index,
url: widget.url[index],
path: widget.path,
@ -1075,6 +1086,9 @@ class _MangaChapterPageGalleryState
_doubleClickAnimationController.forward();
},
isLocale: _isReversHorizontal
? widget.isLocaleList.reversed.toList()[index]
: widget.isLocaleList[index],
);
},
itemCount:

View file

@ -8,18 +8,17 @@ part 'flex_scheme_color_state_provider.g.dart';
class FlexSchemeColorState extends _$FlexSchemeColorState {
@override
FlexSchemeColor build() {
if (ref.read(themeModeStateProvider)) {
if (ref.watch(hiveBoxSettings).get('FlexColorIndex') != null) {
state = ThemeAA
.schemes[ref.watch(hiveBoxSettings).get('FlexColorIndex')].light;
}
} else {
if (ref.watch(hiveBoxSettings).get('FlexColorIndex') != null) {
state = ThemeAA
.schemes[ref.watch(hiveBoxSettings).get('FlexColorIndex')].dark;
}
}
return state;
return ref.read(themeModeStateProvider)
? ThemeAA
.schemes[ref
.watch(hiveBoxSettings)
.get('FlexColorIndex', defaultValue: 2)]
.light
: ThemeAA
.schemes[ref
.watch(hiveBoxSettings)
.get('FlexColorIndex', defaultValue: 2)]
.dark;
}
void setTheme(FlexSchemeColor color, int index) {

View file

@ -22,7 +22,7 @@ class BlendLevelSlider extends ConsumerWidget {
Slider(
min: 0.0,
max: 40.0,
divisions: max(40 - 1, 1),
divisions: max(39, 1),
value: blendLevel,
onChanged: (value) {
ref.read(blendLevelStateProvider.notifier).setBlendLevel(value);

View file

@ -387,10 +387,10 @@ packages:
dependency: "direct main"
description:
name: flutter_riverpod
sha256: b3c3a8a9714b7f88dd2a41e1efbc47f76d620b06ab427c62ae7bc82298cd7dbb
sha256: "9692634c2c00d2a1a5e96bbde0b79a7c6f0f266aa266d76cd52841f791949a89"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.3.5"
flutter_test:
dependency: "direct dev"
description: flutter
@ -837,10 +837,10 @@ packages:
dependency: transitive
description:
name: riverpod
sha256: b0fbf7927333c5c318f7e2c22c8b4fd2542ba294de0373e80ecdb34e0dcd8dc4
sha256: ec5641067d111681ef825754d1327565c987985c7cb52e09bc867b78248854b2
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.3.5"
riverpod_analyzer_utils:
dependency: transitive
description:
@ -1042,10 +1042,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8
sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411
url: "https://pub.dev"
source: hosted
version: "6.0.26"
version: "6.0.27"
url_launcher_ios:
dependency: transitive
description:

View file

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 0.0.11+3
version: 0.0.15+4
environment:
sdk: '>=2.19.5 <3.0.0'