// Author: fruit.com.cn import 'package:flutter/material.dart'; import '../../../core/theme/app_colors.dart'; import '../../../core/theme/app_dimens.dart'; import '../../../l10n/app_localizations.dart'; const double _searchHeight = 40; const double _searchRadius = 18; /// 剧场顶部搜索框:右侧内嵌「识剧」入口。 class DiscoverSearchField extends StatelessWidget { const DiscoverSearchField({ super.key, required this.controller, required this.focusNode, required this.onChanged, required this.loading, required this.onIdentify, this.horizontalPadding = 14, }); final TextEditingController controller; final FocusNode focusNode; final ValueChanged onChanged; final bool loading; final VoidCallback onIdentify; final double horizontalPadding; @override Widget build(BuildContext context) { return Padding( padding: EdgeInsets.symmetric(horizontal: horizontalPadding), child: SizedBox( height: _searchHeight, child: TextField( key: const Key('discover-search'), controller: controller, focusNode: focusNode, onChanged: onChanged, onTapOutside: (_) => focusNode.unfocus(), textInputAction: TextInputAction.search, style: const TextStyle(color: AppColors.onSurface, fontSize: 14), decoration: InputDecoration( isDense: true, filled: true, fillColor: AppColors.card, hintText: AppLocalizations.of(context)!.searchDiscover, hintStyle: const TextStyle(color: AppColors.subtle, fontSize: 12), prefixIcon: const Icon( Icons.search_rounded, color: AppColors.subtle, size: 17, ), suffixIcon: Padding( padding: const EdgeInsets.only(right: 6), child: loading ? const SizedBox.square( dimension: 18, child: Center( child: CircularProgressIndicator(strokeWidth: 2), ), ) : _identifyPill(context), ), suffixIconConstraints: const BoxConstraints( minWidth: 0, minHeight: 0, ), contentPadding: const EdgeInsets.symmetric(horizontal: 12), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(_searchRadius), borderSide: BorderSide.none, ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(_searchRadius), borderSide: const BorderSide(color: AppColors.blue, width: 1), ), ), ), ), ); } Widget _identifyPill(BuildContext context) { final l10n = AppLocalizations.of(context)!; return Padding( padding: const EdgeInsets.symmetric(vertical: 7), child: Material( color: AppColors.raised, borderRadius: BorderRadius.circular(AppDimens.pillRadius), child: InkWell( key: const Key('discover-identify'), onTap: onIdentify, borderRadius: BorderRadius.circular(AppDimens.pillRadius), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon( Icons.center_focus_weak_rounded, color: AppColors.muted, size: 14, ), const SizedBox(width: 4), Text( l10n.identifyDrama, style: const TextStyle(color: AppColors.muted, fontSize: 12), ), ], ), ), ), ), ); } }