我的目标是实现一个带有下拉箭头的文本框,其中包含历史记录,以便用户可以选择以前的输入。但是……我遇到了一个问题,我想缩小该文本框,因为它占用了不必要的空间。问题是,当出现历史值时,它会占用文本框的所有空间,并且下拉列表中的项目看起来太大了。
我想要实现的是,让文本字段的宽度与 IP 地址相同,第二张照片上的文本字段可以工作,并且下拉菜单中可以包含以前输入的较小元素,以便用户可以选择它们。
以下是HistoryTextField
代码:
import 'package:flutter/material.dart';
class HistoryTextField extends StatefulWidget {
const HistoryTextField({super.key});
@override
State<HistoryTextField> createState() => _HistoryTextFieldState();
}
class _HistoryTextFieldState extends State<HistoryTextField> {
final TextEditingController _controller = TextEditingController();
final List<String> _history = [];
String? _selectedHistory;
@override
void initState() {
super.initState();
// Load history from storage (if applicable)
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _addToHistory(String text) {
if (text.isNotEmpty && !_history.contains(text)) {
_history.insert(0, text);
// Save history to storage (if applicable)
}
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: TextField(
controller: _controller,
onChanged: (value) {
setState(() {
_selectedHistory = null;
});
},
onSubmitted: (value) {
_addToHistory(value);
_controller.clear();
},
),
),
DropdownButton<String>(
value: _selectedHistory,
onChanged: (String? newValue) {
setState(() {
_selectedHistory = newValue;
_controller.text = newValue!;
});
},
items: _history.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
);
}
}
以及我如何使用该小部件本身:
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text("IP Address: "),
SizedBox(width: 200, child: HistoryTextField())
],
)
如果您希望
DropdownButton
具有固定大小,则可以使用SizedBox
来定义其宽度并避免放置问题。在 SizedBox 内部,您可以使用 TextAlign.left 在下拉菜单中正确对齐文本。