From 20334fb5491dd92360f2bfcc43c85c3daa93be05 Mon Sep 17 00:00:00 2001 From: chaos-zhu Date: Sun, 24 May 2026 23:25:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/servers/server_form_page.dart | 51 +------------------ mobile/lib/features/servers/servers_tab.dart | 20 ++++---- mobile/lib/l10n/app_localizations.dart | 1 - .../features/servers/servers_tab_test.dart | 1 + 4 files changed, 13 insertions(+), 60 deletions(-) diff --git a/mobile/lib/features/servers/server_form_page.dart b/mobile/lib/features/servers/server_form_page.dart index e346b2a..06b0cc9 100644 --- a/mobile/lib/features/servers/server_form_page.dart +++ b/mobile/lib/features/servers/server_form_page.dart @@ -508,7 +508,7 @@ class _CardSection extends StatelessWidget { ), ), ), - if (trailing != null) trailing!, + ?trailing, ], ), if (children.isNotEmpty) const SizedBox(height: 14), @@ -1096,55 +1096,6 @@ class _ProxyField extends StatelessWidget { } } -class _DropdownField extends StatelessWidget { - const _DropdownField({ - required this.label, - required this.value, - required this.items, - required this.onChanged, - this.validator, - this.icon, - this.enabled = true, - this.emptyText, - this.selectedItemBuilder, - }); - - final String label; - final T? value; - final List> items; - final ValueChanged onChanged; - final String? Function(T?)? validator; - final IconData? icon; - final bool enabled; - final String? emptyText; - final DropdownButtonBuilder? selectedItemBuilder; - - @override - Widget build(BuildContext context) { - return _LabeledBlock( - label: label, - child: DropdownButtonFormField( - initialValue: value, - isExpanded: true, - items: items, - onChanged: enabled ? onChanged : null, - validator: validator, - hint: emptyText == null - ? null - : Text( - emptyText!, - overflow: TextOverflow.ellipsis, - style: const TextStyle(color: _FormColors.label), - ), - selectedItemBuilder: selectedItemBuilder, - icon: Icon(icon ?? Icons.keyboard_arrow_down, color: _FormColors.label), - style: const TextStyle(color: _FormColors.text, fontSize: 15), - decoration: _fieldDecoration(), - ), - ); - } -} - class _PickerField extends StatelessWidget { const _PickerField({ required this.label, diff --git a/mobile/lib/features/servers/servers_tab.dart b/mobile/lib/features/servers/servers_tab.dart index 88c81f1..fa19c89 100644 --- a/mobile/lib/features/servers/servers_tab.dart +++ b/mobile/lib/features/servers/servers_tab.dart @@ -44,6 +44,16 @@ class _ServersTabState extends ConsumerState { super.dispose(); } + void toggleServerExpanded(String id) { + setState(() { + if (_expandedServerIds.contains(id)) { + _expandedServerIds.remove(id); + } else { + _expandedServerIds.add(id); + } + }); + } + Future _refresh() async { await refreshServerSharedData(ref); } @@ -782,15 +792,7 @@ class _ServerCard extends StatelessWidget { ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down, highlighted: expanded, - onTap: () { - state.setState(() { - if (expanded) { - state._expandedServerIds.remove(server.id); - } else { - state._expandedServerIds.add(server.id); - } - }); - }, + onTap: () => state.toggleServerExpanded(server.id), ), ], ), diff --git a/mobile/lib/l10n/app_localizations.dart b/mobile/lib/l10n/app_localizations.dart index 8ff60e0..2e17a43 100644 --- a/mobile/lib/l10n/app_localizations.dart +++ b/mobile/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'strings_en.dart'; diff --git a/mobile/test/features/servers/servers_tab_test.dart b/mobile/test/features/servers/servers_tab_test.dart index 8ad97cb..1730634 100644 --- a/mobile/test/features/servers/servers_tab_test.dart +++ b/mobile/test/features/servers/servers_tab_test.dart @@ -22,6 +22,7 @@ class _FakeRepository implements ServerRepository { this.hosts = const [], this.groups = const [], this.fetchError, + // ignore: unused_element_parameter this.groupFetchError, SshConnectionConfig? config, this.sshError,