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

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:toolbox/view/widget/rebuild.dart';
extension SnackBarX on BuildContext { extension SnackBarX on BuildContext {
void showSnackBar(String text) => 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 'data/res/color.dart';
import 'locator.dart'; import 'locator.dart';
import 'view/widget/custom_appbar.dart'; import 'view/widget/custom_appbar.dart';
import 'view/widget/rebuild.dart';
Future<void> main() async { Future<void> main() async {
_runInZone(() async { _runInZone(() async {
@@ -48,9 +47,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()), ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<SftpProvider>()), ChangeNotifierProvider(create: (_) => locator<SftpProvider>()),
], ],
child: const RebuildWidget( child: const MyApp(),
child: 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/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/utils/platform/base.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/model/app/backup.dart';
import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.dart'; import 'package:toolbox/data/res/path.dart';
@@ -156,7 +157,7 @@ class BackupPage extends StatelessWidget {
onPressed: () async { onPressed: () async {
backup.restore(); backup.restore();
context.pop(); context.pop();
context.showRestartSnackbar(btn: s.restart, msg: s.needRestart); RebuildNodes.app.rebuild();
}, },
child: Text(s.ok), 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/extension/stringx.dart';
import 'package:toolbox/core/utils/platform/auth.dart'; import 'package:toolbox/core/utils/platform/auth.dart';
import 'package:toolbox/core/utils/platform/base.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/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
@@ -372,7 +373,7 @@ class _SettingPageState extends State<SettingPage> {
_setting.primaryColor.put(_selectedColorValue.value); _setting.primaryColor.put(_selectedColorValue.value);
primaryColor = color; primaryColor = color;
context.pop(); context.pop();
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart); RebuildNodes.app.rebuild();
} }
// Widget _buildLaunchPage() { // Widget _buildLaunchPage() {
@@ -484,6 +485,8 @@ class _SettingPageState extends State<SettingPage> {
onSelected: (int idx) { onSelected: (int idx) {
_nightMode.value = idx; _nightMode.value = idx;
_setting.themeMode.put(_nightMode.value); _setting.themeMode.put(_nightMode.value);
RebuildNodes.app.rebuild();
}, },
child: Text( child: Text(
_buildThemeModeStr(_nightMode.value), _buildThemeModeStr(_nightMode.value),
@@ -527,10 +530,7 @@ class _SettingPageState extends State<SettingPage> {
onPressed: () { onPressed: () {
_setting.fontPath.delete(); _setting.fontPath.delete();
context.pop(); context.pop();
context.showRestartSnackbar( RebuildNodes.app.rebuild();
btn: _s.restart,
msg: _s.needRestart,
);
}, },
child: Text(_s.clear), child: Text(_s.clear),
) )
@@ -554,7 +554,7 @@ class _SettingPageState extends State<SettingPage> {
} }
context.pop(); context.pop();
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart); RebuildNodes.app.rebuild();
return; return;
} }
context.showSnackBar(_s.failed); context.showSnackBar(_s.failed);
@@ -634,7 +634,7 @@ class _SettingPageState extends State<SettingPage> {
onSelected: (String idx) { onSelected: (String idx) {
_localeCode.value = idx; _localeCode.value = idx;
_setting.locale.put(idx); _setting.locale.put(idx);
context.showRestartSnackbar(btn: _s.restart, msg: _s.needRestart); RebuildNodes.app.rebuild();
}, },
child: Text( child: Text(
_s.languageName, _s.languageName,
@@ -724,10 +724,8 @@ class _SettingPageState extends State<SettingPage> {
title: Text(_s.fullScreen), title: Text(_s.fullScreen),
trailing: StoreSwitch( trailing: StoreSwitch(
prop: _setting.fullScreen, prop: _setting.fullScreen,
func: (_) => context.showRestartSnackbar( func: (_) =>
btn: _s.restart, RebuildNodes.app.rebuild(),
msg: _s.needRestart,
),
), ),
); );
} }

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,
);
}
}