mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
new: rebuild impl
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
33
lib/core/utils/rebuild.dart
Normal file
33
lib/core/utils/rebuild.dart
Normal 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();
|
||||
}
|
||||
@@ -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(),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
|
||||
@@ -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(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user