This commit is contained in:
lollipopkit
2023-12-27 11:44:45 +08:00
parent 3a3ba4de37
commit 5284ceefd6
11 changed files with 59 additions and 89 deletions

View File

@@ -5,7 +5,6 @@ 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/data/res/rebuild.dart'; import 'package:toolbox/data/res/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';
@@ -27,20 +26,16 @@ class MyApp extends StatelessWidget {
} }
Widget _wrapTheme(BuildContext context) { Widget _wrapTheme(BuildContext context) {
return ValueBuilder( return ListenableBuilder(
listenable: RebuildNodes.app, listenable: RebuildNodes.app,
build: () { builder: (_, __) {
final tMode = Stores.setting.themeMode.fetch(); final tMode = Stores.setting.themeMode.fetch();
// Issue #57 // Issue #57
var themeMode = ThemeMode.system; final themeMode = switch (tMode) {
switch (tMode) { 1 || 2 => ThemeMode.values[tMode],
case 1 || 2: 3 => ThemeMode.dark,
themeMode = ThemeMode.values[tMode]; _ => ThemeMode.system,
break; };
case 3:
themeMode = ThemeMode.dark;
break;
}
final locale = Stores.setting.locale.fetch().toLocale; final locale = Stores.setting.locale.fetch().toLocale;
final darkTheme = ThemeData( final darkTheme = ThemeData(
useMaterial3: true, useMaterial3: true,

View File

@@ -1,7 +1,6 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
// ignore: prefer_void_to_null class RebuildNode implements Listenable {
class RebuildNode implements ValueListenable<Null> {
final List<VoidCallback> _listeners = []; final List<VoidCallback> _listeners = [];
RebuildNode(); RebuildNode();
@@ -21,7 +20,4 @@ class RebuildNode implements ValueListenable<Null> {
listener(); listener();
} }
} }
@override
Null get value => null;
} }

View File

@@ -21,7 +21,6 @@ import 'package:toolbox/view/widget/expand_tile.dart';
import 'package:toolbox/view/widget/cardx.dart'; import 'package:toolbox/view/widget/cardx.dart';
import 'package:toolbox/view/widget/input_field.dart'; import 'package:toolbox/view/widget/input_field.dart';
import 'package:toolbox/view/widget/store_switch.dart'; import 'package:toolbox/view/widget/store_switch.dart';
import 'package:toolbox/view/widget/value_notifier.dart';
class BackupPage extends StatelessWidget { class BackupPage extends StatelessWidget {
BackupPage({super.key}); BackupPage({super.key});
@@ -161,9 +160,9 @@ class BackupPage extends StatelessWidget {
), ),
ListTile( ListTile(
title: Text(l10n.manual), title: Text(l10n.manual),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: webdavLoading, listenable: webdavLoading,
build: () { builder: (_, __) {
if (webdavLoading.value) { if (webdavLoading.value) {
return UIs.centerSizedLoadingSmall; return UIs.centerSizedLoadingSmall;
} }

View File

@@ -29,7 +29,6 @@ import '../../data/res/url.dart';
import '../widget/appbar.dart'; import '../widget/appbar.dart';
import '../widget/cardx.dart'; import '../widget/cardx.dart';
import '../widget/url_text.dart'; import '../widget/url_text.dart';
import '../widget/value_notifier.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
const HomePage({super.key}); const HomePage({super.key});
@@ -114,6 +113,7 @@ class _HomePageState extends State<HomePage>
return Scaffold( return Scaffold(
drawer: _buildDrawer(), drawer: _buildDrawer(),
appBar: CustomAppBar( appBar: CustomAppBar(
centerTitle: false,
title: const Text(BuildData.name), title: const Text(BuildData.name),
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
@@ -133,9 +133,9 @@ class _HomePageState extends State<HomePage>
} }
}, },
), ),
bottomNavigationBar: ValueBuilder( bottomNavigationBar: ListenableBuilder(
listenable: _selectIndex, listenable: _selectIndex,
build: _buildBottomBar, builder: (_, __) => _buildBottomBar(),
), ),
); );
} }

View File

@@ -8,7 +8,6 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/extension/uint8list.dart';
import 'package:toolbox/core/utils/share.dart'; import 'package:toolbox/core/utils/share.dart';
import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/view/widget/value_notifier.dart';
import '../../data/model/server/ping_result.dart'; import '../../data/model/server/ping_result.dart';
import '../../data/res/color.dart'; import '../../data/res/color.dart';
@@ -49,9 +48,9 @@ class _PingPageState extends State<PingPage>
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
return Scaffold( return Scaffold(
body: ValueBuilder( body: ListenableBuilder(
listenable: _results, listenable: _results,
build: _buildBody, builder: (_, __) => _buildBody(),
), ),
floatingActionButton: _buildFAB(), floatingActionButton: _buildFAB(),
); );

View File

@@ -17,7 +17,6 @@ import '../../widget/appbar.dart';
import '../../widget/input_field.dart'; import '../../widget/input_field.dart';
import '../../widget/cardx.dart'; import '../../widget/cardx.dart';
import '../../widget/tag.dart'; import '../../widget/tag.dart';
import '../../widget/value_notifier.dart';
class ServerEditPage extends StatefulWidget { class ServerEditPage extends StatefulWidget {
const ServerEditPage({super.key, this.spi}); const ServerEditPage({super.key, this.spi});
@@ -221,9 +220,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
_buildJumpServer(), _buildJumpServer(),
ListTile( ListTile(
title: Text(l10n.autoConnect), title: Text(l10n.autoConnect),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _autoConnect, listenable: _autoConnect,
build: () => Switch( builder: (_, __) => Switch(
value: _autoConnect.value, value: _autoConnect.value,
onChanged: (val) { onChanged: (val) {
_autoConnect.value = val; _autoConnect.value = val;
@@ -245,9 +244,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
Widget _buildAuth() { Widget _buildAuth() {
final switch_ = ListTile( final switch_ = ListTile(
title: Text(l10n.keyAuth), title: Text(l10n.keyAuth),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _keyIdx, listenable: _keyIdx,
build: () => Switch( builder: (_, __) => Switch(
value: _keyIdx.value != null, value: _keyIdx.value != null,
onChanged: (val) { onChanged: (val) {
if (val) { if (val) {
@@ -261,9 +260,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
); );
/// Put [switch_] out of [ValueBuilder] to avoid rebuild /// Put [switch_] out of [ValueBuilder] to avoid rebuild
return ValueBuilder( return ListenableBuilder(
listenable: _keyIdx, listenable: _keyIdx,
build: () { builder: (_, __) {
final children = <Widget>[switch_]; final children = <Widget>[switch_];
if (_keyIdx.value != null) { if (_keyIdx.value != null) {
children.add(_buildKeyAuth()); children.add(_buildKeyAuth());
@@ -334,9 +333,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
} }
Widget _buildRadio(int index, PrivateKeyInfo pki) { Widget _buildRadio(int index, PrivateKeyInfo pki) {
return ValueBuilder( return ListenableBuilder(
listenable: _keyIdx, listenable: _keyIdx,
build: () => Radio<int>( builder: (_, __) => Radio<int>(
value: index, value: index,
groupValue: _keyIdx.value, groupValue: _keyIdx.value,
onChanged: (value) { onChanged: (value) {
@@ -347,9 +346,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
} }
Widget _buildJumpServer() { Widget _buildJumpServer() {
return ValueBuilder( return ListenableBuilder(
listenable: _jumpServer, listenable: _jumpServer,
build: () { builder: (_, __) {
final children = Pros.server.servers final children = Pros.server.servers
.where((element) => element.spi.jumpId == null) .where((element) => element.spi.jumpId == null)
.where((element) => element.spi.id != widget.spi?.id) .where((element) => element.spi.id != widget.spi?.id)

View File

@@ -14,7 +14,6 @@ import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/try_limiter.dart'; import 'package:toolbox/data/model/server/try_limiter.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';
import 'package:toolbox/view/widget/value_notifier.dart';
import '../../../core/route.dart'; import '../../../core/route.dart';
import '../../../data/model/app/net_view.dart'; import '../../../data/model/app/net_view.dart';
@@ -61,9 +60,9 @@ class _ServerPageState extends State<ServerPage>
super.build(context); super.build(context);
return Scaffold( return Scaffold(
appBar: _buildTagsSwitcher(Pros.server), appBar: _buildTagsSwitcher(Pros.server),
body: ValueBuilder( body: ListenableBuilder(
listenable: Stores.setting.textFactor.listenable(), listenable: Stores.setting.textFactor.listenable(),
build: () { builder: (_, __) {
_textFactorDouble = Stores.setting.textFactor.fetch(); _textFactorDouble = Stores.setting.textFactor.fetch();
_textFactor = TextScaler.linear(_textFactorDouble); _textFactor = TextScaler.linear(_textFactorDouble);
return _buildBody(); return _buildBody();
@@ -200,9 +199,9 @@ class _ServerPageState extends State<ServerPage>
final cardStatus = _getCardNoti(id); final cardStatus = _getCardNoti(id);
final title = _buildServerCardTitle(srv.status, srv.state, srv.spi); final title = _buildServerCardTitle(srv.status, srv.state, srv.spi);
return ValueBuilder( return ListenableBuilder(
listenable: cardStatus, listenable: cardStatus,
build: () { builder: (_, __) {
late final List<Widget> children; late final List<Widget> children;
if (srv.state == ServerState.finished) { if (srv.state == ServerState.finished) {
if (cardStatus.value.flip) { if (cardStatus.value.flip) {
@@ -417,9 +416,9 @@ class _ServerPageState extends State<ServerPage>
Widget _buildDisk(ServerStatus ss, String id) { Widget _buildDisk(ServerStatus ss, String id) {
final cardNoti = _getCardNoti(id); final cardNoti = _getCardNoti(id);
return ValueBuilder( return ListenableBuilder(
listenable: cardNoti, listenable: cardNoti,
build: () { builder: (_, __) {
final rootDisk = findRootDisk(ss.disk); final rootDisk = findRootDisk(ss.disk);
final isSpeed = cardNoti.value.diskIO ?? final isSpeed = cardNoti.value.diskIO ??
!Stores.setting.serverTabPreferDiskAmount.fetch(); !Stores.setting.serverTabPreferDiskAmount.fetch();

View File

@@ -34,7 +34,6 @@ import '../../widget/appbar.dart';
import '../../widget/input_field.dart'; import '../../widget/input_field.dart';
import '../../widget/cardx.dart'; import '../../widget/cardx.dart';
import '../../widget/store_switch.dart'; import '../../widget/store_switch.dart';
import '../../widget/value_notifier.dart';
class SettingPage extends StatefulWidget { class SettingPage extends StatefulWidget {
const SettingPage({super.key}); const SettingPage({super.key});
@@ -285,9 +284,9 @@ class _SettingPageState extends State<SettingPage> {
onTap: () { onTap: () {
_updateIntervalKey.currentState?.showButtonMenu(); _updateIntervalKey.currentState?.showButtonMenu();
}, },
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _updateInterval, listenable: _updateInterval,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _updateIntervalKey, key: _updateIntervalKey,
itemBuilder: (_) => items, itemBuilder: (_) => items,
initialValue: _updateInterval.value, initialValue: _updateInterval.value,
@@ -311,9 +310,9 @@ class _SettingPageState extends State<SettingPage> {
Widget _buildAppColor() { Widget _buildAppColor() {
return ListTile( return ListTile(
trailing: ClipOval( trailing: ClipOval(
child: ValueBuilder( child: ListenableBuilder(
listenable: _selectedColorValue, listenable: _selectedColorValue,
build: () => Container( builder: (_, __) => Container(
color: primaryColor, color: primaryColor,
height: 27, height: 27,
width: 27, width: 27,
@@ -444,8 +443,8 @@ class _SettingPageState extends State<SettingPage> {
onTap: () { onTap: () {
_maxRetryKey.currentState?.showButtonMenu(); _maxRetryKey.currentState?.showButtonMenu();
}, },
trailing: ValueBuilder( trailing: ListenableBuilder(
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _maxRetryKey, key: _maxRetryKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _maxRetryCount.value, initialValue: _maxRetryCount.value,
@@ -490,9 +489,9 @@ class _SettingPageState extends State<SettingPage> {
onTap: () { onTap: () {
_themeKey.currentState?.showButtonMenu(); _themeKey.currentState?.showButtonMenu();
}, },
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _nightMode, listenable: _nightMode,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _themeKey, key: _themeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _nightMode.value, initialValue: _nightMode.value,
@@ -577,9 +576,9 @@ class _SettingPageState extends State<SettingPage> {
} }
Widget _buildTermFontSize() { Widget _buildTermFontSize() {
return ValueBuilder( return ListenableBuilder(
listenable: _termFontSize, listenable: _termFontSize,
build: () => ListTile( builder: (_, __) => ListTile(
title: Text(l10n.fontSize), title: Text(l10n.fontSize),
trailing: Text( trailing: Text(
_termFontSize.value.toString(), _termFontSize.value.toString(),
@@ -641,9 +640,9 @@ class _SettingPageState extends State<SettingPage> {
onTap: () { onTap: () {
_localeKey.currentState?.showButtonMenu(); _localeKey.currentState?.showButtonMenu();
}, },
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _localeCode, listenable: _localeCode,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _localeKey, key: _localeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _localeCode.value, initialValue: _localeCode.value,
@@ -681,9 +680,9 @@ class _SettingPageState extends State<SettingPage> {
).toList(); ).toList();
return ListTile( return ListTile(
title: Text('${l10n.light} ${l10n.theme.toLowerCase()}'), title: Text('${l10n.light} ${l10n.theme.toLowerCase()}'),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _editorTheme, listenable: _editorTheme,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _editorThemeKey, key: _editorThemeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _editorTheme.value, initialValue: _editorTheme.value,
@@ -714,9 +713,9 @@ class _SettingPageState extends State<SettingPage> {
).toList(); ).toList();
return ListTile( return ListTile(
title: Text('${l10n.dark} ${l10n.theme.toLowerCase()}'), title: Text('${l10n.dark} ${l10n.theme.toLowerCase()}'),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _editorDarkTheme, listenable: _editorDarkTheme,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _editorDarkThemeKey, key: _editorDarkThemeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _editorDarkTheme.value, initialValue: _editorDarkTheme.value,
@@ -768,9 +767,9 @@ class _SettingPageState extends State<SettingPage> {
onTap: () { onTap: () {
_rotateQuarterKey.currentState?.showButtonMenu(); _rotateQuarterKey.currentState?.showButtonMenu();
}, },
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _rotateQuarter, listenable: _rotateQuarter,
build: () => PopupMenuButton( builder: (_, __) => PopupMenuButton(
key: _rotateQuarterKey, key: _rotateQuarterKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _rotateQuarter.value, initialValue: _rotateQuarter.value,
@@ -816,9 +815,9 @@ class _SettingPageState extends State<SettingPage> {
return ListTile( return ListTile(
title: Text(l10n.keyboardType), title: Text(l10n.keyboardType),
subtitle: Text(l10n.keyboardCompatibility, style: UIs.textGrey), subtitle: Text(l10n.keyboardCompatibility, style: UIs.textGrey),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _keyboardType, listenable: _keyboardType,
build: () => PopupMenuButton<int>( builder: (_, __) => PopupMenuButton<int>(
key: _keyboardTypeKey, key: _keyboardTypeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _keyboardType.value, initialValue: _keyboardType.value,
@@ -872,9 +871,9 @@ class _SettingPageState extends State<SettingPage> {
.toList(); .toList();
return ListTile( return ListTile(
title: Text(l10n.netViewType), title: Text(l10n.netViewType),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _netViewType, listenable: _netViewType,
build: () => PopupMenuButton<NetViewType>( builder: (_, __) => PopupMenuButton<NetViewType>(
key: _netViewTypeKey, key: _netViewTypeKey,
itemBuilder: (BuildContext context) => items, itemBuilder: (BuildContext context) => items,
initialValue: _netViewType.value, initialValue: _netViewType.value,
@@ -942,9 +941,9 @@ class _SettingPageState extends State<SettingPage> {
return ListTile( return ListTile(
title: Text(l10n.textScaler), title: Text(l10n.textScaler),
subtitle: Text(l10n.textScalerTip, style: UIs.textGrey), subtitle: Text(l10n.textScalerTip, style: UIs.textGrey),
trailing: ValueBuilder( trailing: ListenableBuilder(
listenable: _textScaler, listenable: _textScaler,
build: () => Text( builder: (_, __) => Text(
_textScaler.value.toString(), _textScaler.value.toString(),
style: UIs.text15, style: UIs.text15,
), ),
@@ -1013,9 +1012,9 @@ class _SettingPageState extends State<SettingPage> {
} }
Widget _buildEditorFontSize() { Widget _buildEditorFontSize() {
return ValueBuilder( return ListenableBuilder(
listenable: _editorFontSize, listenable: _editorFontSize,
build: () => ListTile( builder: (_, __) => ListTile(
title: Text(l10n.fontSize), title: Text(l10n.fontSize),
trailing: Text( trailing: Text(
_editorFontSize.value.toString(), _editorFontSize.value.toString(),

View File

@@ -11,7 +11,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
super.key, super.key,
this.title, this.title,
this.actions, this.actions,
this.centerTitle, this.centerTitle = true,
this.leading, this.leading,
this.backgroundColor, this.backgroundColor,
}); });

View File

@@ -1,16 +0,0 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class ValueBuilder<T> extends ValueListenableBuilder<T> {
final ValueListenable<T> listenable;
final Widget Function() build;
ValueBuilder({
super.key,
required this.listenable,
required this.build,
}) : super(
valueListenable: listenable,
builder: (_, __, ___) => build(),
);
}

View File

@@ -81,7 +81,7 @@ Overlay 3.0T 1.4t 1.6T 48%/Share/CacheDev1_data/Container/Container-SATA/LIB/DOC
/dev/mapper/vg1-snap10016 /dev/mapper/vg1-snap10016
3.0T 1.4T 1.6T 48% /mnt/snapshot/1/10016 3.0T 1.4T 1.6T 48% /mnt/snapshot/1/10016
'''; ''';
final disks = parseDisk(raw); final disks = Disk.parse(raw);
print(disks.map((e) => '${e.mount} ${e.used}').join('\n')); print(disks.map((e) => '${e.mount} ${e.used}').join('\n'));
}); });
} }