import 'package:flutter/material.dart'; class SearchBarWidget extends StatelessWidget { final String hintText; final String buttonText; final ValueChanged onSearch; final TextEditingController controller; // 改为必传参数 final bool autoFocus; final bool showResetButton; final String resetButtonText; final VoidCallback? onReset; final bool isClickableOnly; final VoidCallback? onInputTap; final ValueChanged? onTextChanged; // 新增文本变化回调 const SearchBarWidget({ Key? key, required this.onSearch, required this.controller, // 必须传入controller this.hintText = '请输入关键字', this.buttonText = '搜索', this.autoFocus = false, this.showResetButton = false, this.resetButtonText = '重置', this.onReset, this.isClickableOnly = false, this.onInputTap, this.onTextChanged, // 可选文本变化监听 }) : super(key: key); // 公共方法:更新输入框内容(可在外部调用) void updateText(String newText) { controller.text = newText; controller.selection = TextSelection.fromPosition( TextPosition(offset: newText.length), ); // 可选:触发文本变化回调 onTextChanged?.call(newText); } @override Widget build(BuildContext context) { return Row( children: [ Expanded( child: GestureDetector( onTap: isClickableOnly ? onInputTap : null, child: AbsorbPointer( absorbing: isClickableOnly, child: TextField( controller: controller, autofocus: autoFocus, readOnly: isClickableOnly, style: const TextStyle(fontSize: 15), onChanged: onTextChanged, // 监听文本变化 decoration: InputDecoration( filled: true, fillColor: const Color(0xFFF5F5F5), prefixIcon: const Icon(Icons.search_rounded), hintText: hintText, border: OutlineInputBorder( borderRadius: BorderRadius.circular(5), borderSide: BorderSide.none, ), isDense: true, contentPadding: const EdgeInsets.symmetric(vertical: 8), ), onSubmitted: onSearch, ), ), ), ), const SizedBox(width: 10), // 搜索按钮 ElevatedButton( onPressed: () => onSearch(controller.text.trim()), style: ElevatedButton.styleFrom( backgroundColor: Colors.green, padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), elevation: 4, shadowColor: Colors.black45, ), child: Text( buttonText, style: const TextStyle( color: Colors.white, fontSize: 16, ), ), ), // 重置按钮 if (showResetButton) const SizedBox(width: 10), if (showResetButton) ElevatedButton( onPressed: () { updateText(''); // 使用统一方法清空 onReset?.call(); }, style: ElevatedButton.styleFrom( backgroundColor: Colors.blue, padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), elevation: 1, shadowColor: Colors.black26, ), child: Text( resetButtonText, style: TextStyle( color: Colors.white, fontSize: 16, ), ), ), ], ); } }