feature: pure black dark mode , refactor code

This commit is contained in:
kodjomoustapha 2023-05-19 10:09:10 +01:00
parent 1403048fc4
commit 6ef6d943c2
22 changed files with 256 additions and 101 deletions

View file

@ -43,6 +43,7 @@ android {
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.kodjodevf.mangayomi"
// You can update the following values to match your application needs.

View file

@ -16,6 +16,7 @@ import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/router/router.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/blend_level_state_provider.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/flex_scheme_color_state_provider.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/theme_mode_state_provider.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
@ -109,6 +110,7 @@ class _MyAppState extends ConsumerState<MyApp> {
Widget build(BuildContext context) {
final isThemeLight = ref.watch(themeModeStateProvider);
final blendLevel = ref.watch(blendLevelStateProvider);
final pureBlackDarkMode = ref.watch(pureBlackDarkModeStateProvider);
ThemeData themeLight = FlexThemeData.light(
colors: ref.watch(flexSchemeColorStateProvider),
surfaceMode: FlexSurfaceMode.highScaffoldLevelSurface,
@ -132,6 +134,7 @@ class _MyAppState extends ConsumerState<MyApp> {
surfaceMode: FlexSurfaceMode.level,
blendLevel: blendLevel.toInt(),
appBarOpacity: 0.00,
scaffoldBackground: pureBlackDarkMode ? Colors.black : null,
subThemesData: const FlexSubThemesData(
blendOnLevel: 10,
thinBorderWidth: 2.0,

View file

@ -73,6 +73,8 @@ class Settings {
bool? onlyIncludePinnedSources;
bool? pureBlackDarkMode;
Settings(
{this.id = 227,
this.displayType = DisplayType.compactGrid,
@ -104,7 +106,8 @@ class Settings {
this.animatePageTransitions = true,
this.doubleTapAnimationSpeed = 1,
this.showNSFW = true,
this.onlyIncludePinnedSources = false});
this.onlyIncludePinnedSources = false,
this.pureBlackDarkMode = false});
}
enum DisplayType {

View file

@ -151,40 +151,45 @@ const SettingsSchema = CollectionSchema(
type: IsarType.objectList,
target: r'PersonalReaderMode',
),
r'relativeTimesTamps': PropertySchema(
r'pureBlackDarkMode': PropertySchema(
id: 25,
name: r'pureBlackDarkMode',
type: IsarType.bool,
),
r'relativeTimesTamps': PropertySchema(
id: 26,
name: r'relativeTimesTamps',
type: IsarType.long,
),
r'showNSFW': PropertySchema(
id: 26,
id: 27,
name: r'showNSFW',
type: IsarType.bool,
),
r'showPagesNumber': PropertySchema(
id: 27,
id: 28,
name: r'showPagesNumber',
type: IsarType.bool,
),
r'sortChapterList': PropertySchema(
id: 28,
id: 29,
name: r'sortChapterList',
type: IsarType.objectList,
target: r'SortChapter',
),
r'sortLibraryManga': PropertySchema(
id: 29,
id: 30,
name: r'sortLibraryManga',
type: IsarType.object,
target: r'SortLibraryManga',
),
r'themeIsDark': PropertySchema(
id: 30,
id: 31,
name: r'themeIsDark',
type: IsarType.bool,
),
r'userAgent': PropertySchema(
id: 31,
id: 32,
name: r'userAgent',
type: IsarType.string,
)
@ -419,23 +424,24 @@ void _settingsSerialize(
PersonalReaderModeSchema.serialize,
object.personalReaderModeList,
);
writer.writeLong(offsets[25], object.relativeTimesTamps);
writer.writeBool(offsets[26], object.showNSFW);
writer.writeBool(offsets[27], object.showPagesNumber);
writer.writeBool(offsets[25], object.pureBlackDarkMode);
writer.writeLong(offsets[26], object.relativeTimesTamps);
writer.writeBool(offsets[27], object.showNSFW);
writer.writeBool(offsets[28], object.showPagesNumber);
writer.writeObjectList<SortChapter>(
offsets[28],
offsets[29],
allOffsets,
SortChapterSchema.serialize,
object.sortChapterList,
);
writer.writeObject<SortLibraryManga>(
offsets[29],
offsets[30],
allOffsets,
SortLibraryMangaSchema.serialize,
object.sortLibraryManga,
);
writer.writeBool(offsets[30], object.themeIsDark);
writer.writeString(offsets[31], object.userAgent);
writer.writeBool(offsets[31], object.themeIsDark);
writer.writeString(offsets[32], object.userAgent);
}
Settings _settingsDeserialize(
@ -498,22 +504,23 @@ Settings _settingsDeserialize(
allOffsets,
PersonalReaderMode(),
),
relativeTimesTamps: reader.readLongOrNull(offsets[25]),
showNSFW: reader.readBoolOrNull(offsets[26]),
showPagesNumber: reader.readBoolOrNull(offsets[27]),
pureBlackDarkMode: reader.readBoolOrNull(offsets[25]),
relativeTimesTamps: reader.readLongOrNull(offsets[26]),
showNSFW: reader.readBoolOrNull(offsets[27]),
showPagesNumber: reader.readBoolOrNull(offsets[28]),
sortChapterList: reader.readObjectList<SortChapter>(
offsets[28],
offsets[29],
SortChapterSchema.deserialize,
allOffsets,
SortChapter(),
),
sortLibraryManga: reader.readObjectOrNull<SortLibraryManga>(
offsets[29],
offsets[30],
SortLibraryMangaSchema.deserialize,
allOffsets,
),
themeIsDark: reader.readBoolOrNull(offsets[30]),
userAgent: reader.readStringOrNull(offsets[31]),
themeIsDark: reader.readBoolOrNull(offsets[31]),
userAgent: reader.readStringOrNull(offsets[32]),
);
object.chapterFilterBookmarkedList =
reader.readObjectList<ChapterFilterBookmarked>(
@ -627,27 +634,29 @@ P _settingsDeserializeProp<P>(
PersonalReaderMode(),
)) as P;
case 25:
return (reader.readLongOrNull(offset)) as P;
case 26:
return (reader.readBoolOrNull(offset)) as P;
case 26:
return (reader.readLongOrNull(offset)) as P;
case 27:
return (reader.readBoolOrNull(offset)) as P;
case 28:
return (reader.readBoolOrNull(offset)) as P;
case 29:
return (reader.readObjectList<SortChapter>(
offset,
SortChapterSchema.deserialize,
allOffsets,
SortChapter(),
)) as P;
case 29:
case 30:
return (reader.readObjectOrNull<SortLibraryManga>(
offset,
SortLibraryMangaSchema.deserialize,
allOffsets,
)) as P;
case 30:
return (reader.readBoolOrNull(offset)) as P;
case 31:
return (reader.readBoolOrNull(offset)) as P;
case 32:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@ -2595,6 +2604,34 @@ extension SettingsQueryFilter
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
pureBlackDarkModeIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'pureBlackDarkMode',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
pureBlackDarkModeIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'pureBlackDarkMode',
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
pureBlackDarkModeEqualTo(bool? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'pureBlackDarkMode',
value: value,
));
});
}
QueryBuilder<Settings, Settings, QAfterFilterCondition>
relativeTimesTampsIsNull() {
return QueryBuilder.apply(this, (query) {
@ -3337,6 +3374,18 @@ extension SettingsQuerySortBy on QueryBuilder<Settings, Settings, QSortBy> {
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> sortByPureBlackDarkMode() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'pureBlackDarkMode', Sort.asc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> sortByPureBlackDarkModeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'pureBlackDarkMode', Sort.desc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> sortByRelativeTimesTamps() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'relativeTimesTamps', Sort.asc);
@ -3655,6 +3704,18 @@ extension SettingsQuerySortThenBy
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> thenByPureBlackDarkMode() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'pureBlackDarkMode', Sort.asc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> thenByPureBlackDarkModeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'pureBlackDarkMode', Sort.desc);
});
}
QueryBuilder<Settings, Settings, QAfterSortBy> thenByRelativeTimesTamps() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'relativeTimesTamps', Sort.asc);
@ -3840,6 +3901,12 @@ extension SettingsQueryWhereDistinct
});
}
QueryBuilder<Settings, Settings, QDistinct> distinctByPureBlackDarkMode() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'pureBlackDarkMode');
});
}
QueryBuilder<Settings, Settings, QDistinct> distinctByRelativeTimesTamps() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'relativeTimesTamps');
@ -4052,6 +4119,12 @@ extension SettingsQueryProperty
});
}
QueryBuilder<Settings, bool?, QQueryOperations> pureBlackDarkModeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'pureBlackDarkMode');
});
}
QueryBuilder<Settings, int?, QQueryOperations> relativeTimesTampsProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'relativeTimesTamps');

View file

@ -3,7 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga_type.dart';
import 'package:mangayomi/services/webview/webview.dart';
import 'package:mangayomi/views/webview/webview.dart';
import 'package:mangayomi/views/browse/browse_screen.dart';
import 'package:mangayomi/views/browse/extension/extension_lang.dart';
import 'package:mangayomi/views/browse/global_search_screen.dart';

View file

@ -106,7 +106,7 @@ class Japscan extends MangaYomiServices {
{required String source,
required int page,
required AutoDisposeFutureProviderRef ref}) async {
final dom = ref.watch(httpGetProvider(
final dom = await ref.watch(httpGetProvider(
url: "https://www.japscan.lol/", source: source, resDom: true)
.future) as Document?;
if (dom!.querySelectorAll('#top_mangas_week > ul > li ').isNotEmpty) {
@ -236,9 +236,12 @@ class Japscan extends MangaYomiServices {
.split('')
.map((char) => lookupTable[char] ?? char)
.join();
final decoded = utf8.decode(base64.decode(unscrambledData));
final data = jsonDecode(decoded);
pageUrls = data["imagesLink"].map((it) => it).toList();
for (var url in data["imagesLink"]) {
pageUrls.add(url);
}
} catch (_) {}
}
isOk = true;

View file

@ -14,11 +14,11 @@ class MangaKawaii extends MangaYomiServices {
required String source,
required AutoDisposeFutureProviderRef ref}) async {
final dom = await ref.watch(httpGetProvider(
url: 'https://www.mangakawaii.io$url', source: source, resDom: true)
url: 'https://www.mangakawaii.io${manga.url}', source: source, resDom: true)
.future) as Document?;
List detail = [];
manga.imageUrl =
"https://cdn.mangakawaii.pics/uploads$url/cover/cover_250x350.jpg";
"https://cdn.mangakawaii.pics/uploads${manga.url}/cover/cover_250x350.jpg";
if (dom!.querySelectorAll('dd.text-justify.text-break').isNotEmpty) {
final tt = dom
.querySelectorAll('dd.text-justify.text-break')

View file

@ -1,20 +1,22 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/views/browse/extension/extension_screen.dart';
import 'package:mangayomi/views/browse/extension/refresh_source_list_data.dart';
import 'package:mangayomi/views/browse/migrate_screen.dart';
import 'package:mangayomi/views/browse/sources_screen.dart';
import 'package:mangayomi/views/library/search_text_form_field.dart';
class BrowseScreen extends StatefulWidget {
class BrowseScreen extends ConsumerStatefulWidget {
const BrowseScreen({super.key});
@override
State<BrowseScreen> createState() => _BrowseScreenState();
ConsumerState<BrowseScreen> createState() => _BrowseScreenState();
}
class _BrowseScreenState extends State<BrowseScreen>
class _BrowseScreenState extends ConsumerState<BrowseScreen>
with TickerProviderStateMixin {
late TabController _tabBarController;
@ -43,6 +45,7 @@ class _BrowseScreenState extends State<BrowseScreen>
bool _isSearch = false;
@override
Widget build(BuildContext context) {
ref.watch(refreshSourceListDataProvider);
return DefaultTabController(
animationDuration: Duration.zero,
length: 3,

View file

@ -20,7 +20,7 @@ class ExtensionsLang extends ConsumerWidget {
stream:
isar.sources.filter().idIsNotNull().watch(fireImmediately: true),
builder: (context, snapshot) {
List<Source>? entri = snapshot.hasData ? snapshot.data : [];
List<Source>? entries = snapshot.hasData ? snapshot.data : [];
return ListView.builder(
itemCount: language.length,
itemBuilder: (context, index) {
@ -28,22 +28,14 @@ class ExtensionsLang extends ConsumerWidget {
lang: lang(language[index]),
onChanged: (val) {
isar.writeTxnSync(() {
if (val == true) {
for (var source in entri) {
if (source.lang == lang(language[index])) {
isar.sources.putSync(source..isActive = true);
}
}
} else {
for (var source in entri) {
if (source.lang == lang(language[index])) {
isar.sources.putSync(source..isActive = false);
}
for (var source in entries) {
if (source.lang == lang(language[index])) {
isar.sources.putSync(source..isActive = val == true);
}
}
});
},
value: entri!
value: entries!
.where((element) =>
element.lang == "${lang(language[index])}")
.where((element) => element.isActive!)

View file

@ -5,7 +5,6 @@ import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/utils/lang.dart';
import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart';
import 'package:mangayomi/views/browse/extension/widgets/extension_list_tile_widget.dart';
import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart';
@ -17,7 +16,6 @@ class ExtensionScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(refreshFilterDataProvider);
return Padding(
padding: const EdgeInsets.only(top: 10),
child: StreamBuilder(

View file

@ -3,10 +3,10 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/sources/source_list.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'refresh_filter_data.g.dart';
part 'refresh_source_list_data.g.dart';
@riverpod
refreshFilterData(RefreshFilterDataRef ref) {
refreshSourceListData(RefreshSourceListDataRef ref) {
isar.writeTxnSync(() {
for (var source in sourcesList) {
final sourceF = isar.sources

View file

@ -1,24 +1,25 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'refresh_filter_data.dart';
part of 'refresh_source_list_data.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$refreshFilterDataHash() => r'60d819be10e6b321283d90070df92cae84fe3489';
String _$refreshSourceListDataHash() =>
r'f77838cebad50f030d2038d07584199b4509f407';
/// See also [refreshFilterData].
@ProviderFor(refreshFilterData)
final refreshFilterDataProvider = AutoDisposeProvider<dynamic>.internal(
refreshFilterData,
name: r'refreshFilterDataProvider',
/// See also [refreshSourceListData].
@ProviderFor(refreshSourceListData)
final refreshSourceListDataProvider = AutoDisposeProvider<dynamic>.internal(
refreshSourceListData,
name: r'refreshSourceListDataProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$refreshFilterDataHash,
: _$refreshSourceListDataHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef RefreshFilterDataRef = AutoDisposeProviderRef<dynamic>;
typedef RefreshSourceListDataRef = AutoDisposeProviderRef<dynamic>;
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions

View file

@ -9,7 +9,6 @@ import 'package:mangayomi/models/manga_type.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/utils/headers.dart';
import 'package:mangayomi/utils/lang.dart';
import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart';
import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart';
class SourcesScreen extends ConsumerWidget {
@ -17,8 +16,6 @@ class SourcesScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(refreshFilterDataProvider);
return Padding(
padding: const EdgeInsets.only(top: 10),
child: StreamBuilder(
@ -26,6 +23,8 @@ class SourcesScreen extends ConsumerWidget {
.filter()
.idIsNotNull()
.isAddedEqualTo(true)
.and()
.isActiveEqualTo(true)
.watch(fireImmediately: true),
builder: (context, snapshot) {
if (!snapshot.hasData) {

View file

@ -46,7 +46,30 @@ class MangaReaderView extends ConsumerWidget {
return chapterData.when(
data: (data) {
if (data.pageUrls.isEmpty) {
Navigator.pop(context);
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: AppBar(
title: const Text(''),
leading: BackButton(
onPressed: () {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
overlays: SystemUiOverlay.values);
Navigator.pop(context);
},
),
),
body: WillPopScope(
onWillPop: () async {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
overlays: SystemUiOverlay.values);
Navigator.pop(context);
return false;
},
child: const Center(
child: Text("Error"),
),
),
);
}
return MangaChapterPageGallery(
path: data.path!,

View file

@ -4,6 +4,7 @@ import 'package:mangayomi/utils/colors.dart';
import 'package:mangayomi/utils/date.dart';
import 'package:mangayomi/utils/media_query.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/date_format_state_provider.dart';
import 'package:mangayomi/views/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
import 'package:mangayomi/views/more/settings/appearance/widgets/blend_level_slider.dart';
import 'package:mangayomi/views/more/settings/appearance/widgets/dark_mode_button.dart';
import 'package:mangayomi/views/more/settings/appearance/widgets/theme_selector.dart';
@ -15,6 +16,7 @@ class AppearanceScreen extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final dateFormatState = ref.watch(dateFormatStateProvider);
final relativeTimestamps = ref.watch(relativeTimesTampsStateProvider);
final pureBlackDarkMode = ref.watch(pureBlackDarkModeStateProvider);
return Scaffold(
appBar: AppBar(
title: const Text("Appearance"),
@ -37,7 +39,21 @@ class AppearanceScreen extends ConsumerWidget {
),
const DarkModeButton(),
const ThemeSelector(),
const BlendLevelSlider()
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: SwitchListTile(
title: const Text(
"Pure black dark mode",
style: TextStyle(fontWeight: FontWeight.bold),
),
value: pureBlackDarkMode,
onChanged: (value) {
ref
.read(pureBlackDarkModeStateProvider.notifier)
.set(value);
}),
),
if (!pureBlackDarkMode) const BlendLevelSlider()
],
),
),
@ -112,7 +128,7 @@ class AppearanceScreen extends ConsumerWidget {
},
title: const Text(
"Relative timestamps",
style: TextStyle(),
style: TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
relativeTimestampsList[relativeTimestamps],
@ -177,7 +193,7 @@ class AppearanceScreen extends ConsumerWidget {
},
title: const Text(
"Date format",
style: TextStyle(),
style: TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
"$dateFormatState (${dateFormat(DateTime.now().millisecondsSinceEpoch.toString(), useRelativeTimesTamps: false, dateFormat: dateFormatState, ref: ref)})",

View file

@ -0,0 +1,19 @@
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'pure_black_dark_mode_state_provider.g.dart';
@riverpod
class PureBlackDarkModeState extends _$PureBlackDarkModeState {
@override
bool build() {
return isar.settings.getSync(227)!.pureBlackDarkMode!;
}
void set(bool value) {
final settings = isar.settings.getSync(227);
state = value;
isar.writeTxnSync(
() => isar.settings.putSync(settings!..pureBlackDarkMode = value));
}
}

View file

@ -0,0 +1,26 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'pure_black_dark_mode_state_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$pureBlackDarkModeStateHash() =>
r'2dd98617810c8677341dc5cc485d226e6d610cf5';
/// See also [PureBlackDarkModeState].
@ProviderFor(PureBlackDarkModeState)
final pureBlackDarkModeStateProvider =
AutoDisposeNotifierProvider<PureBlackDarkModeState, bool>.internal(
PureBlackDarkModeState.new,
name: r'pureBlackDarkModeStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$pureBlackDarkModeStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$PureBlackDarkModeState = AutoDisposeNotifier<bool>;
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions

View file

@ -13,7 +13,7 @@ class BlendLevelSlider extends ConsumerWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(
padding: EdgeInsets.only(left: 22),
padding: EdgeInsets.only(left: 18),
child: Text(
'Color blend Level',
style: TextStyle(fontWeight: FontWeight.bold),

View file

@ -16,29 +16,24 @@ class DarkModeButton extends ConsumerStatefulWidget {
class _DarkModeButtonState extends ConsumerState<DarkModeButton> {
@override
Widget build(BuildContext context) {
bool isDark = ref.watch(themeModeStateProvider);
return ListTile(
onTap: () {
if (!isDark) {
ref.read(themeModeStateProvider.notifier).setLightTheme();
} else {
ref.read(themeModeStateProvider.notifier).setDarkTheme();
}
},
title: const Text("Dark mode"),
subtitle: Text(
ref.watch(themeModeStateProvider) ? 'Off' : 'On',
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
),
trailing: Switch(
value: !isDark,
onChanged: (dd) {
if (!isDark) {
ref.read(themeModeStateProvider.notifier).setLightTheme();
} else {
ref.read(themeModeStateProvider.notifier).setDarkTheme();
}
}));
bool isLight = ref.watch(themeModeStateProvider);
return SwitchListTile(
onChanged: (value) {
if (value) {
ref.read(themeModeStateProvider.notifier).setLightTheme();
} else {
ref.read(themeModeStateProvider.notifier).setDarkTheme();
}
},
title: const Text(
"Dark mode",
style: TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
isLight ? 'Off' : 'On',
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
),
value: isLight,
);
}
}

View file

@ -30,7 +30,7 @@ class _ThemeSelectorState extends ConsumerState<ThemeSelector> {
return SizedBox(
height: 130,
child: Row(
children: <Widget>[
children: [
Expanded(
child: ListView.builder(
padding: const EdgeInsetsDirectional.only(start: 8, end: 16),

View file

@ -27,7 +27,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
double progress = 0;
InAppWebViewController? webViewController;
InAppWebViewController? _webViewController;
late String _url = widget.url;
late String _title = widget.title;
bool _canGoback = false;
@ -37,7 +37,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
return SafeArea(
child: WillPopScope(
onWillPop: () async {
webViewController?.goBack();
_webViewController?.goBack();
return false;
},
child: Column(
@ -72,7 +72,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
color: _canGoback ? null : Colors.grey),
onPressed: _canGoback
? () {
webViewController?.goBack();
_webViewController?.goBack();
}
: null,
),
@ -81,7 +81,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
color: _canGoForward ? null : Colors.grey),
onPressed: _canGoForward
? () {
webViewController?.goForward();
_webViewController?.goForward();
}
: null,
),
@ -97,7 +97,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
];
}, onSelected: (value) async {
if (value == 0) {
webViewController?.reload();
_webViewController?.reload();
} else if (value == 1) {
Share.share(_url);
} else if (value == 2) {
@ -117,7 +117,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
child: InAppWebView(
key: webViewKey,
onWebViewCreated: (controller) async {
webViewController = controller;
_webViewController = controller;
},
onLoadStart: (controller, url) async {
setState(() {

View file

@ -1,5 +1,5 @@
name: mangayomi
description: A new Flutter project.
description: Free and open source manga reader multi plateform app inspired by Tachiyomi.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev