fix switch to setting page (#7849)
Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
parent
e9d9a656ab
commit
45137d5506
@ -153,7 +153,13 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
size: 22,
|
size: 22,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () => DesktopSettingPage.switch2page(0),
|
onTap: () => {
|
||||||
|
if (DesktopSettingPage.tabKeys.isNotEmpty)
|
||||||
|
{
|
||||||
|
DesktopSettingPage.switch2page(
|
||||||
|
DesktopSettingPage.tabKeys[0])
|
||||||
|
}
|
||||||
|
},
|
||||||
onHover: (value) => _editHover.value = value,
|
onHover: (value) => _editHover.value = value,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -347,7 +353,8 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
).marginOnly(right: 8, top: 4),
|
).marginOnly(right: 8, top: 4),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () => DesktopSettingPage.switch2page(0),
|
onTap: () => DesktopSettingPage.switch2page(
|
||||||
|
SettingsTabKey.safety),
|
||||||
onHover: (value) => editHover.value = value,
|
onHover: (value) => editHover.value = value,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -36,34 +36,57 @@ const double _kTitleFontSize = 20;
|
|||||||
const double _kContentFontSize = 15;
|
const double _kContentFontSize = 15;
|
||||||
const Color _accentColor = MyTheme.accent;
|
const Color _accentColor = MyTheme.accent;
|
||||||
const String _kSettingPageControllerTag = 'settingPageController';
|
const String _kSettingPageControllerTag = 'settingPageController';
|
||||||
const String _kSettingPageIndexTag = 'settingPageIndex';
|
const String _kSettingPageTabKeyTag = 'settingPageTabKey';
|
||||||
const int _kPageCount = 6;
|
|
||||||
|
|
||||||
class _TabInfo {
|
class _TabInfo {
|
||||||
|
late final SettingsTabKey key;
|
||||||
late final String label;
|
late final String label;
|
||||||
late final IconData unselected;
|
late final IconData unselected;
|
||||||
late final IconData selected;
|
late final IconData selected;
|
||||||
_TabInfo(this.label, this.unselected, this.selected);
|
_TabInfo(this.key, this.label, this.unselected, this.selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SettingsTabKey {
|
||||||
|
general,
|
||||||
|
safety,
|
||||||
|
network,
|
||||||
|
display,
|
||||||
|
plugin,
|
||||||
|
account,
|
||||||
|
about,
|
||||||
}
|
}
|
||||||
|
|
||||||
class DesktopSettingPage extends StatefulWidget {
|
class DesktopSettingPage extends StatefulWidget {
|
||||||
final int initialPage;
|
final SettingsTabKey initialTabkey;
|
||||||
|
static final List<SettingsTabKey> tabKeys = [
|
||||||
|
SettingsTabKey.general,
|
||||||
|
if (!bind.isOutgoingOnly() && !bind.isDisableSettings())
|
||||||
|
SettingsTabKey.safety,
|
||||||
|
if (!bind.isDisableSettings()) SettingsTabKey.network,
|
||||||
|
if (!bind.isIncomingOnly()) SettingsTabKey.display,
|
||||||
|
if (!isWeb && !bind.isIncomingOnly() && bind.pluginFeatureIsEnabled())
|
||||||
|
SettingsTabKey.plugin,
|
||||||
|
if (!bind.isDisableAccount()) SettingsTabKey.account,
|
||||||
|
SettingsTabKey.about,
|
||||||
|
];
|
||||||
|
|
||||||
const DesktopSettingPage({Key? key, required this.initialPage})
|
DesktopSettingPage({Key? key, required this.initialTabkey}) : super(key: key);
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<DesktopSettingPage> createState() => _DesktopSettingPageState();
|
State<DesktopSettingPage> createState() => _DesktopSettingPageState();
|
||||||
|
|
||||||
static void switch2page(int page) {
|
static void switch2page(SettingsTabKey page) {
|
||||||
if (page >= _kPageCount) return;
|
|
||||||
try {
|
try {
|
||||||
|
int index = tabKeys.indexOf(page);
|
||||||
|
if (index == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (Get.isRegistered<PageController>(tag: _kSettingPageControllerTag)) {
|
if (Get.isRegistered<PageController>(tag: _kSettingPageControllerTag)) {
|
||||||
DesktopTabPage.onAddSetting(initialPage: page);
|
DesktopTabPage.onAddSetting(initialPage: page);
|
||||||
PageController controller = Get.find(tag: _kSettingPageControllerTag);
|
PageController controller = Get.find(tag: _kSettingPageControllerTag);
|
||||||
RxInt selectedIndex = Get.find(tag: _kSettingPageIndexTag);
|
Rx<SettingsTabKey> selected = Get.find(tag: _kSettingPageTabKeyTag);
|
||||||
selectedIndex.value = page;
|
selected.value = page;
|
||||||
controller.jumpToPage(page);
|
controller.jumpToPage(index);
|
||||||
} else {
|
} else {
|
||||||
DesktopTabPage.onAddSetting(initialPage: page);
|
DesktopTabPage.onAddSetting(initialPage: page);
|
||||||
}
|
}
|
||||||
@ -76,7 +99,7 @@ class DesktopSettingPage extends StatefulWidget {
|
|||||||
class _DesktopSettingPageState extends State<DesktopSettingPage>
|
class _DesktopSettingPageState extends State<DesktopSettingPage>
|
||||||
with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
|
with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
|
||||||
late PageController controller;
|
late PageController controller;
|
||||||
late RxInt selectedIndex;
|
late Rx<SettingsTabKey> selectedTab;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
@ -84,14 +107,20 @@ class _DesktopSettingPageState extends State<DesktopSettingPage>
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
selectedIndex =
|
var initialIndex = DesktopSettingPage.tabKeys.indexOf(widget.initialTabkey);
|
||||||
(widget.initialPage < _kPageCount ? widget.initialPage : 0).obs;
|
if (initialIndex == -1) {
|
||||||
Get.put<RxInt>(selectedIndex, tag: _kSettingPageIndexTag);
|
initialIndex = 0;
|
||||||
controller = PageController(initialPage: widget.initialPage);
|
}
|
||||||
|
selectedTab = DesktopSettingPage.tabKeys[initialIndex].obs;
|
||||||
|
Get.put<Rx<SettingsTabKey>>(selectedTab, tag: _kSettingPageTabKeyTag);
|
||||||
|
controller = PageController(initialPage: initialIndex);
|
||||||
Get.put<PageController>(controller, tag: _kSettingPageControllerTag);
|
Get.put<PageController>(controller, tag: _kSettingPageControllerTag);
|
||||||
controller.addListener(() {
|
controller.addListener(() {
|
||||||
if (controller.page != null) {
|
if (controller.page != null) {
|
||||||
selectedIndex.value = controller.page!.toInt();
|
int page = controller.page!.toInt();
|
||||||
|
if (page < DesktopSettingPage.tabKeys.length) {
|
||||||
|
selectedTab.value = DesktopSettingPage.tabKeys[page];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -100,26 +129,43 @@ class _DesktopSettingPageState extends State<DesktopSettingPage>
|
|||||||
void dispose() {
|
void dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
Get.delete<PageController>(tag: _kSettingPageControllerTag);
|
Get.delete<PageController>(tag: _kSettingPageControllerTag);
|
||||||
Get.delete<RxInt>(tag: _kSettingPageIndexTag);
|
Get.delete<RxInt>(tag: _kSettingPageTabKeyTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<_TabInfo> _settingTabs() {
|
List<_TabInfo> _settingTabs() {
|
||||||
final List<_TabInfo> settingTabs = <_TabInfo>[
|
final List<_TabInfo> settingTabs = <_TabInfo>[];
|
||||||
_TabInfo('General', Icons.settings_outlined, Icons.settings),
|
for (final tab in DesktopSettingPage.tabKeys) {
|
||||||
if (!bind.isOutgoingOnly() && !bind.isDisableSettings())
|
switch (tab) {
|
||||||
_TabInfo('Security', Icons.enhanced_encryption_outlined,
|
case SettingsTabKey.general:
|
||||||
Icons.enhanced_encryption),
|
settingTabs.add(_TabInfo(
|
||||||
if (!bind.isDisableSettings())
|
tab, 'General', Icons.settings_outlined, Icons.settings));
|
||||||
_TabInfo('Network', Icons.link_outlined, Icons.link),
|
break;
|
||||||
if (!bind.isIncomingOnly())
|
case SettingsTabKey.safety:
|
||||||
_TabInfo(
|
settingTabs.add(_TabInfo(tab, 'Security',
|
||||||
'Display', Icons.desktop_windows_outlined, Icons.desktop_windows),
|
Icons.enhanced_encryption_outlined, Icons.enhanced_encryption));
|
||||||
if (!isWeb && !bind.isIncomingOnly() && bind.pluginFeatureIsEnabled())
|
break;
|
||||||
_TabInfo('Plugin', Icons.extension_outlined, Icons.extension),
|
case SettingsTabKey.network:
|
||||||
if (!bind.isDisableAccount())
|
settingTabs
|
||||||
_TabInfo('Account', Icons.person_outline, Icons.person),
|
.add(_TabInfo(tab, 'Network', Icons.link_outlined, Icons.link));
|
||||||
_TabInfo('About', Icons.info_outline, Icons.info)
|
break;
|
||||||
];
|
case SettingsTabKey.display:
|
||||||
|
settingTabs.add(_TabInfo(tab, 'Display',
|
||||||
|
Icons.desktop_windows_outlined, Icons.desktop_windows));
|
||||||
|
break;
|
||||||
|
case SettingsTabKey.plugin:
|
||||||
|
settingTabs.add(_TabInfo(
|
||||||
|
tab, 'Plugin', Icons.extension_outlined, Icons.extension));
|
||||||
|
break;
|
||||||
|
case SettingsTabKey.account:
|
||||||
|
settingTabs.add(
|
||||||
|
_TabInfo(tab, 'Account', Icons.person_outline, Icons.person));
|
||||||
|
break;
|
||||||
|
case SettingsTabKey.about:
|
||||||
|
settingTabs
|
||||||
|
.add(_TabInfo(tab, 'About', Icons.info_outline, Icons.info));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return settingTabs;
|
return settingTabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,26 +244,26 @@ class _DesktopSettingPageState extends State<DesktopSettingPage>
|
|||||||
child: ListView(
|
child: ListView(
|
||||||
physics: DraggableNeverScrollableScrollPhysics(),
|
physics: DraggableNeverScrollableScrollPhysics(),
|
||||||
controller: scrollController,
|
controller: scrollController,
|
||||||
children: tabs
|
children: tabs.map((tab) => _listItem(tab: tab)).toList(),
|
||||||
.asMap()
|
|
||||||
.entries
|
|
||||||
.map((tab) => _listItem(tab: tab.value, index: tab.key))
|
|
||||||
.toList(),
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _listItem({required _TabInfo tab, required int index}) {
|
Widget _listItem({required _TabInfo tab}) {
|
||||||
return Obx(() {
|
return Obx(() {
|
||||||
bool selected = index == selectedIndex.value;
|
bool selected = tab.key == selectedTab.value;
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
width: _kTabWidth,
|
width: _kTabWidth,
|
||||||
height: _kTabHeight,
|
height: _kTabHeight,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (selectedIndex.value != index) {
|
if (selectedTab.value != tab.key) {
|
||||||
|
int index = DesktopSettingPage.tabKeys.indexOf(tab.key);
|
||||||
|
if (index == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
controller.jumpToPage(index);
|
controller.jumpToPage(index);
|
||||||
}
|
}
|
||||||
selectedIndex.value = index;
|
selectedTab.value = tab.key;
|
||||||
},
|
},
|
||||||
child: Row(children: [
|
child: Row(children: [
|
||||||
Container(
|
Container(
|
||||||
@ -2064,8 +2110,9 @@ void changeSocks5Proxy() async {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: TextField(
|
child: TextField(
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
errorText: proxyMsg.isNotEmpty ? proxyMsg : null,
|
errorText: proxyMsg.isNotEmpty ? proxyMsg : null,
|
||||||
hintText: translate('Default protocol and port are Socks5 and 1080'),
|
hintText: translate(
|
||||||
|
'Default protocol and port are Socks5 and 1080'),
|
||||||
),
|
),
|
||||||
controller: proxyController,
|
controller: proxyController,
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
|
@ -17,7 +17,8 @@ class DesktopTabPage extends StatefulWidget {
|
|||||||
@override
|
@override
|
||||||
State<DesktopTabPage> createState() => _DesktopTabPageState();
|
State<DesktopTabPage> createState() => _DesktopTabPageState();
|
||||||
|
|
||||||
static void onAddSetting({int initialPage = 0}) {
|
static void onAddSetting(
|
||||||
|
{SettingsTabKey initialPage = SettingsTabKey.general}) {
|
||||||
try {
|
try {
|
||||||
DesktopTabController tabController = Get.find();
|
DesktopTabController tabController = Get.find();
|
||||||
tabController.add(TabInfo(
|
tabController.add(TabInfo(
|
||||||
@ -27,7 +28,7 @@ class DesktopTabPage extends StatefulWidget {
|
|||||||
unselectedIcon: Icons.build_outlined,
|
unselectedIcon: Icons.build_outlined,
|
||||||
page: DesktopSettingPage(
|
page: DesktopSettingPage(
|
||||||
key: const ValueKey(kTabLabelSettingPage),
|
key: const ValueKey(kTabLabelSettingPage),
|
||||||
initialPage: initialPage,
|
initialTabkey: initialPage,
|
||||||
)));
|
)));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrintStack(label: '$e');
|
debugPrintStack(label: '$e');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user