Skip to content
This repository has been archived by the owner on Nov 7, 2023. It is now read-only.

Commit

Permalink
fix(splash_page): stuck on splash_page after popping home_page
Browse files Browse the repository at this point in the history
  • Loading branch information
zyrouge committed Oct 19, 2021
1 parent ee24bd8 commit d2f3073
Show file tree
Hide file tree
Showing 10 changed files with 227 additions and 195 deletions.
1 change: 1 addition & 0 deletions lib/core/models/translations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -130,4 +130,5 @@ abstract class TranslationSentences {
String chaptersRead();
String volumesCompleted();
String nsfw();
String restartAppForChangesToTakeEffect();
}
3 changes: 1 addition & 2 deletions lib/pages/anime_page/watch_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,7 @@ class WatchPageState extends State<WatchPage>
AppState.settings.current.animeTrackerWatchPercent) {
final int? episode = int.tryParse(widget.episode.episode);

// TODO: Uncomment this
if (episode != null /* && !hasSynced */) {
if (episode != null && !hasSynced) {
hasSynced = true;

final AnimeProgress progress = AnimeProgress(episodes: episode);
Expand Down
39 changes: 25 additions & 14 deletions lib/pages/settings_page/setting_labels/preference.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,32 @@ List<Widget> getPreference(
final Future<void> Function() save,
) =>
<Widget>[
SettingRadio<String>(
title: Translator.t.language(),
dialogTitle: Translator.t.chooseLanguage(),
icon: Icons.language,
value: settings.locale ?? Translator.t.code.code,
labels: <String, String>{
for (final TranslationSentences lang
in Translator.translations.values)
lang.code.code: lang.code.language,
},
onChanged: (final String val) async {
settings.locale = val;
Builder(
builder: (final BuildContext context) => SettingRadio<String>(
title: Translator.t.language(),
dialogTitle: Translator.t.chooseLanguage(),
icon: Icons.language,
value: settings.locale ?? Translator.t.code.code,
labels: <String, String>{
for (final TranslationSentences lang
in Translator.translations.values)
lang.code.code: lang.code.language,
},
onChanged: (final String val) async {
settings.locale = val;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
Translator.t.restartAppForChangesToTakeEffect(),
style: Theme.of(context).textTheme.bodyText1,
),
backgroundColor: Theme.of(context).cardColor,
),
);

await save();
},
await save();
},
),
),
SettingRadio<int>(
title: Translator.t.theme(),
Expand Down
158 changes: 158 additions & 0 deletions lib/pages/stacked_home_page/home_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import 'package:flutter/material.dart';
import '../../components/bar_item.dart';
import '../../components/bottom_bar.dart' as bottom_bar;
import '../../components/side_bar.dart' as side_bar;
import '../../plugins/helpers/deeplink.dart';
import '../../plugins/helpers/protocol_handler.dart';
import '../../plugins/helpers/stateful_holder.dart';
import '../../plugins/helpers/ui.dart';
import '../../plugins/router.dart';
import '../../plugins/state.dart';

class StackPage {
StackPage(this.index, this.r);

final RouteInfo r;
final int index;
}

class Page extends StatefulWidget {
const Page({
final Key? key,
}) : super(key: key);

@override
_PageState createState() => _PageState();
}

class _PageState extends State<Page> with DidLoadStater {
late int currentIndex;
late PageController controller;

final List<String> stackRoutes = <String>[
RouteNames.home,
RouteNames.search,
RouteNames.store,
];

late final List<StackPage> stack = stackRoutes
.asMap()
.map(
(final int i, final String x) =>
MapEntry<int, StackPage>(i, StackPage(i, RouteManager.routes[x]!)),
)
.values
.toList();

late final List<RouteInfo> routes = RouteManager.labeledRoutes
.where((final RouteInfo x) => !stackRoutes.contains(x.route))
.toList();

int? getIndexOfRoute(final String route) => stack.indexWhere(
(final StackPage x) => x.r.route == RouteManager.getOnlyRoute(route),
);

@override
void initState() {
super.initState();

currentIndex = (RouteManager.keeper.currentRoute != null
? getIndexOfRoute(RouteManager.keeper.currentRoute!.settings.name!)
: null) ??
0;
controller = PageController(initialPage: currentIndex);
}

@override
void didChangeDependencies() {
super.didChangeDependencies();

doLoadStateIfHasnt();
}

@override
Future<void> load() async {
final String? link = await Deeplink.getInitialLink();
if (link != null) {
ProtocolHandler.handle(link);
}

Deeplink.hasHandledInitialLink = true;
Deeplink.listen();
}

void goToPage(final int page) => controller.animateToPage(
page,
duration: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
);

Widget applySideIfSupported(final Widget body, final List<BarItem> items) {
if (AppState.isDesktop) {
return Stack(
children: <Widget>[
Positioned.fill(
left: remToPx(3),
child: body,
),
Align(
alignment: Alignment.centerLeft,
child: side_bar.SideBar(items: items),
),
],
);
}

return body;
}

@override
Widget build(final BuildContext context) {
final List<BarItem> barItems = <BarItem>[
...stack.map(
(final StackPage x) => BarItem(
name: x.r.name!(),
icon: x.r.icon!,
isActive: currentIndex == x.index,
onPressed: () {
goToPage(x.index);
},
),
),
...routes.map(
(final RouteInfo x) => BarItem(
name: x.name!(),
icon: x.icon!,
isActive: false,
onPressed: () {
Navigator.of(context).pushNamed(x.route);
},
),
),
];

return Scaffold(
body: SafeArea(
child: applySideIfSupported(
PageView(
onPageChanged: (final int page) {
setState(() {
currentIndex = page;
});
},
physics: const NeverScrollableScrollPhysics(),
controller: controller,
children:
stack.map((final StackPage x) => x.r.builder(context)).toList(),
),
barItems,
),
),
bottomNavigationBar: AppState.isMobile
? bottom_bar.BottomBar(
items: barItems,
)
: const SizedBox.shrink(),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,22 @@ import '../../plugins/helpers/logger.dart';
import '../../plugins/helpers/screen.dart';
import '../../plugins/helpers/stateful_holder.dart';
import '../../plugins/helpers/ui.dart';
import '../../plugins/router.dart';
import '../../plugins/state.dart';
import '../../plugins/translator/translator.dart';
import '../../plugins/updater/updater.dart';

class Page extends StatefulWidget {
const Page({
required final this.refresh,
final Key? key,
}) : super(key: key);

final void Function() refresh;

@override
_PageState createState() => _PageState();
}

class _PageState extends State<Page> with RouteAware, DidLoadStater {
class _PageState extends State<Page> with DidLoadStater {
final ValueNotifier<String> status =
ValueNotifier<String>(Translator.t.initializing());

Expand All @@ -33,20 +34,6 @@ class _PageState extends State<Page> with RouteAware, DidLoadStater {
doLoadStateIfHasnt();
}

@override
void dispose() {
RouteManager.observer.unsubscribe(this);

super.dispose();
}

@override
void didPopNext() {
if (AppState.isMobile) {
Navigator.of(context).pop();
}
}

@override
Future<void> load() async {
if (!AppLifecycle.ready) {
Expand Down Expand Up @@ -110,11 +97,7 @@ class _PageState extends State<Page> with RouteAware, DidLoadStater {
}

await Future<void>.delayed(const Duration(seconds: 2));
}

if (mounted) {
Navigator.of(context).pushNamed(RouteNames.home);
RouteManager.observer.subscribe(this, ModalRoute.of(context)!);
widget.refresh();
}
}

Expand Down

0 comments on commit d2f3073

Please sign in to comment.