From 25e8330e3b3ce9068afe51b9984f8a8b12086ec8 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sun, 28 Jun 2026 22:21:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E4=BF=AE=E8=81=9A=E7=84=A6?= =?UTF-8?q?=E6=97=B6=E8=BE=93=E5=85=A5=E6=A1=86=E6=A9=99=E8=BE=B9=E6=BC=8F?= =?UTF-8?q?=E5=87=BA=E9=94=99=E4=BD=8D/=E8=A2=AB=E8=A3=81(=E7=99=BB?= =?UTF-8?q?=E5=BD=95=C2=B7=E6=B3=A8=E5=86=8C=C2=B7=E6=90=9C=E7=B4=A2=C2=B7?= =?UTF-8?q?=E5=85=91=E6=8D=A2=E7=A0=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主题 inputDecorationTheme 设了 focusedBorder: OutlineInputBorder(accent), 而登录/注册的邮箱·密码·验证码、节点页搜索框、兑换码框这几处的 TextField 只写 border: InputBorder.none、未覆盖 focusedBorder —— 聚焦瞬间主题的橙色 OutlineInputBorder 漏到内层 TextField 上,与外层自定义容器圆角错位/左右被裁。 统一加共享 kBareInput 装饰(pangolin_theme.dart)关掉所有边框状态泄漏, 四处替换。只压边框、不动 filled/fillColor —— 未聚焦态外观与改前一致, 不动 golden;聚焦指示仍由外层容器自己的 Border.all(accent) 负责。 Co-Authored-By: Claude Opus 4.8 --- client/lib/pangolin_theme.dart | 21 +++++++++++++++++++++ client/lib/screens/nodes_page.dart | 6 +++--- client/lib/widgets/account_screens.dart | 3 ++- client/lib/widgets/auth_screen.dart | 4 +++- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/client/lib/pangolin_theme.dart b/client/lib/pangolin_theme.dart index 62051af..9d78795 100644 --- a/client/lib/pangolin_theme.dart +++ b/client/lib/pangolin_theme.dart @@ -24,6 +24,27 @@ import 'package:google_fonts/google_fonts.dart'; import 'pangolin_tokens.gen.dart'; export 'pangolin_tokens.gen.dart'; +/// 自定义容器(自带圆角/边框/聚焦态)里嵌 [TextField] 时用此装饰: +/// 彻底关掉主题 [inputDecorationTheme] 的边框/填充泄漏。 +/// +/// 坑:主题里设了 `focusedBorder: OutlineInputBorder(accent)` + `filled:true`。 +/// 字段只写 `border: InputBorder.none` **不覆盖 focusedBorder** 时,聚焦瞬间主题的 +/// 橙色 OutlineInputBorder + 填充会画到内层 TextField 上,与外层容器圆角错位/被裁 +/// (登录/注册的邮箱·密码·验证码、节点页搜索框聚焦时左右各缺一截即此因)。 +/// 聚焦指示交给外层容器自己负责(如 [Border.all(accent)])。 +/// +/// 注意:只压边框、不动 `filled`/`fillColor`——未聚焦态外观与改前完全一致(不动 golden), +/// 漏出的橙框只来自 `focusedBorder`(未聚焦态早已解析为无边框)。 +const InputDecoration kBareInput = InputDecoration( + isCollapsed: true, + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + disabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + focusedErrorBorder: InputBorder.none, +); + /// ── Semantic tokens, resolved per brightness ─────────────────────── @immutable class PangolinScheme extends ThemeExtension { diff --git a/client/lib/screens/nodes_page.dart b/client/lib/screens/nodes_page.dart index 23a5aee..f93e3fb 100644 --- a/client/lib/screens/nodes_page.dart +++ b/client/lib/screens/nodes_page.dart @@ -165,10 +165,10 @@ class _SearchBox extends StatelessWidget { child: TextField( onChanged: onChanged, style: PangolinText.sm.copyWith(color: c.fg1, fontSize: 15), - decoration: InputDecoration( - isCollapsed: true, + // kBareInput 关掉主题 inputDecorationTheme 的边框/填充泄漏(否则聚焦时 + // 橙色 OutlineInputBorder 会画到内层 TextField 上、与搜索框圆角错位/被裁)。 + decoration: kBareInput.copyWith( contentPadding: const EdgeInsets.symmetric(vertical: 12), - border: InputBorder.none, hintText: hint, hintStyle: PangolinText.sm.copyWith(color: c.fg3, fontSize: 15), ), diff --git a/client/lib/widgets/account_screens.dart b/client/lib/widgets/account_screens.dart index ab19b93..ed60b21 100644 --- a/client/lib/widgets/account_screens.dart +++ b/client/lib/widgets/account_screens.dart @@ -260,7 +260,8 @@ class _RedeemScreenState extends ConsumerState { controller: _code, textCapitalization: TextCapitalization.characters, style: PangolinText.mono.copyWith(color: c.fg1, letterSpacing: 1.5), - decoration: InputDecoration(border: InputBorder.none, isCollapsed: true, contentPadding: const EdgeInsets.symmetric(vertical: 13), hintText: t.redeemPh, hintStyle: PangolinText.sm.copyWith(color: c.fg3)), + // kBareInput 关掉主题边框/填充泄漏(聚焦时橙框错位/被裁),聚焦态交给外层 Border。 + decoration: kBareInput.copyWith(contentPadding: const EdgeInsets.symmetric(vertical: 13), hintText: t.redeemPh, hintStyle: PangolinText.sm.copyWith(color: c.fg3)), onChanged: (_) => setState(() {}), ), )), diff --git a/client/lib/widgets/auth_screen.dart b/client/lib/widgets/auth_screen.dart index a6384d1..b48c830 100644 --- a/client/lib/widgets/auth_screen.dart +++ b/client/lib/widgets/auth_screen.dart @@ -329,8 +329,10 @@ class _AuthScreenState extends ConsumerState ]); } + // kBareInput 关掉主题 inputDecorationTheme 的边框/填充泄漏(否则聚焦时橙色 + // OutlineInputBorder 会画到内层 TextField 上、与外层容器错位/被裁)。 InputDecoration get _bare => - const InputDecoration(border: InputBorder.none, isCollapsed: true, contentPadding: EdgeInsets.symmetric(vertical: 13)); + kBareInput.copyWith(contentPadding: const EdgeInsets.symmetric(vertical: 13)); // 密码输入 + 显示/隐藏切换(眼睛按钮)。 Widget _pwInput(PangolinScheme c, String hint) => Row(children: [