我使用的自动完成小部件向用户显示建议,到目前为止一切顺利,问题是,我的应用程序还支持网络,我想建议可以通过键盘控制,即,上下箭头移动选项,并输入确认所选选项.我如何才能做到这一点?
这是我的代码的可执行摘录:
class _MyHomePageState extends State<MyHomePage> {
final controller = TextEditingController();
final focus = FocusNode();
bool loadingAutocomplete = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: RawAutocomplete(
textEditingController: controller,
focusNode: focus,
optionsBuilder: (TextEditingValue textEditingValue) async {
return getCities(textEditingValue.text);
},
fieldViewBuilder: (BuildContext context,
TextEditingController controller,
FocusNode focusNode,
VoidCallback onFieldSubmitted) {
return TextField(
controller: controller,
focusNode: focusNode,
onSubmitted: (value) {
focusNode.requestFocus();
},
decoration: InputDecoration(
labelText: 'Cities',
));
},
optionsViewBuilder: (context, onSelected, options) => Padding(
padding: const EdgeInsets.only(top: 4),
child: Align(
alignment: Alignment.topLeft,
child: Material(
color: Colors.white,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(bottom: Radius.circular(4)),
),
child: SizedBox(
width: 300,
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: options.length,
shrinkWrap: false,
itemBuilder: (BuildContext context, int index) {
final String option = options.elementAt(index);
return InkWell(
onTap: () => onSelected(option),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(option),
),
);
},
),
),
),
),
),
),
);
}
Future<List<String>> getCities(String value) async {
// Simulate a delay
await Future.delayed(Duration(seconds: 1));
// List of cities
List<String> cities = [
'New York',
'Los Angeles',
'Chicago',
'Houston',
'Phoenix',
'Philadelphia',
'San Antonio',
'San Diego',
'Dallas',
'San Jose'
];
return cities
.where((element) => element.toLowerCase().contains(value))
.toList();
}
}
1条答案
按热度按时间pu3pd22g1#
试试这个,我通常用的。您可以自定义意见箱的大小或任何您想要的。