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: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]
|
||||||
|
|||||||
@@ -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),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
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 '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(),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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