new: rebuild impl

This commit is contained in:
lollipopkit
2023-09-21 19:24:05 +08:00
parent 453eb200a8
commit cc4a05bf11
7 changed files with 51 additions and 60 deletions

View File

@@ -3,7 +3,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/locale.dart';
import 'package:toolbox/core/utils/rebuild.dart';
import 'package:toolbox/data/res/store.dart';
import 'package:toolbox/view/widget/value_notifier.dart';
import 'core/utils/ui.dart';
import 'data/res/build_data.dart';
@@ -33,9 +35,10 @@ class MyApp extends StatelessWidget {
}
Widget _wrapTheme(BuildContext context) {
return ValueListenableBuilder<int>(
valueListenable: Stores.setting.themeMode.listenable(),
builder: (_, tMode, __) {
return ValueBuilder(
listenable: RebuildNodes.app,
build: () {
final tMode = Stores.setting.themeMode.fetch();
final isAMOLED = tMode >= 0 && tMode <= ThemeMode.values.length - 1;
// Issue #57
// if not [ok] -> [AMOLED] mode, use [ThemeMode.dark]

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:toolbox/view/widget/rebuild.dart';
extension SnackBarX on BuildContext {
void showSnackBar(String text) =>
@@ -22,12 +21,4 @@ extension SnackBarX on BuildContext {
),
));
}
void showRestartSnackbar({String? btn, String? msg}) {
showSnackBarWithAction(
msg ?? 'Need restart to take effect',
btn ?? 'Restart',
() => RebuildWidget.restartApp(this),
);
}
}

View File

@@ -0,0 +1,33 @@
import 'package:flutter/foundation.dart';
// ignore: prefer_void_to_null
class _RebuildNode implements ValueListenable<Null> {
final List<VoidCallback> _listeners = [];
_RebuildNode();
@override
void addListener(VoidCallback listener) {
_listeners.add(listener);
}
@override
void removeListener(VoidCallback listener) {
_listeners.remove(listener);
}
void rebuild() {
for (var listener in _listeners) {
listener();
}
}
@override
Null get value => null;
}
class RebuildNodes {
const RebuildNodes._();
static final _RebuildNode app = _RebuildNode();
}

View File

@@ -31,7 +31,6 @@ import 'data/provider/virtual_keyboard.dart';
import 'data/res/color.dart';
import 'locator.dart';
import 'view/widget/custom_appbar.dart';
import 'view/widget/rebuild.dart';
Future<void> main() async {
_runInZone(() async {
@@ -48,9 +47,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<SftpProvider>()),
],
child: const RebuildWidget(
child: MyApp(),
),
child: const MyApp(),
),
);
});

View File

@@ -8,6 +8,7 @@ import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/core/utils/rebuild.dart';
import 'package:toolbox/data/model/app/backup.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.dart';
@@ -156,7 +157,7 @@ class BackupPage extends StatelessWidget {
onPressed: () async {
backup.restore();
context.pop();
context.showRestartSnackbar(btn: s.restart, msg: s.needRestart);
RebuildNodes.app.rebuild();
},
child: Text(s.ok),
),

View File

@@ -12,6 +12,7 @@ import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/utils/platform/auth.dart';
import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/core/utils/rebuild.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart';
@@ -372,7 +373,7 @@ class _SettingPageState extends State<SettingPage> {
_setting.primaryColor.put(_selectedColorValue.value);
primaryColor = color;
context.pop();
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart);
RebuildNodes.app.rebuild();
}
// Widget _buildLaunchPage() {
@@ -484,6 +485,8 @@ class _SettingPageState extends State<SettingPage> {
onSelected: (int idx) {
_nightMode.value = idx;
_setting.themeMode.put(_nightMode.value);
RebuildNodes.app.rebuild();
},
child: Text(
_buildThemeModeStr(_nightMode.value),
@@ -527,10 +530,7 @@ class _SettingPageState extends State<SettingPage> {
onPressed: () {
_setting.fontPath.delete();
context.pop();
context.showRestartSnackbar(
btn: _s.restart,
msg: _s.needRestart,
);
RebuildNodes.app.rebuild();
},
child: Text(_s.clear),
)
@@ -554,7 +554,7 @@ class _SettingPageState extends State<SettingPage> {
}
context.pop();
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart);
RebuildNodes.app.rebuild();
return;
}
context.showSnackBar(_s.failed);
@@ -634,7 +634,7 @@ class _SettingPageState extends State<SettingPage> {
onSelected: (String idx) {
_localeCode.value = idx;
_setting.locale.put(idx);
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart);
RebuildNodes.app.rebuild();
},
child: Text(
_s.languageName,
@@ -724,10 +724,8 @@ class _SettingPageState extends State<SettingPage> {
title: Text(_s.fullScreen),
trailing: StoreSwitch(
prop: _setting.fullScreen,
func: (_) => context.showRestartSnackbar(
btn: _s.restart,
msg: _s.needRestart,
),
func: (_) =>
RebuildNodes.app.rebuild(),
),
);
}

View File

@@ -1,32 +0,0 @@
import 'package:flutter/material.dart';
class RebuildWidget extends StatefulWidget {
const RebuildWidget({super.key, required this.child});
final Widget child;
static void restartApp(BuildContext context) {
context.findAncestorStateOfType<_RebuildWidgetState>()?.restartApp();
}
@override
_RebuildWidgetState createState() => _RebuildWidgetState();
}
class _RebuildWidgetState extends State<RebuildWidget> {
Key key = UniqueKey();
void restartApp() {
setState(() {
key = UniqueKey();
});
}
@override
Widget build(BuildContext context) {
return KeyedSubtree(
key: key,
child: widget.child,
);
}
}