我正在尝试使用flutter的Raw Autocomplete类来显示 由文本框的输入确定的许多属性(图片、名称和价格)。 通过点击一种产品进行选择时,用户应该通过以下方式获得反馈 小吃店消息。 显示和建议工作正常,但小吃店不行。
我尝试使用生成器(正如文档建议使上下文可用),但这似乎不起作用。 我不断收到此错误“使用不包含支架的上下文调用 Scaffold.of()”。 欢迎任何帮助。
RawAutocomplete<Product>(
optionsBuilder: (TextEditingValue textEditingValue) {
return myProducts!.where((Product option) {
// Search based on User.toString, which includes both name and
// email, even though the display string is just the name.
return option
.toString()
.contains(textEditingValue.text.toLowerCase());
});
},
displayStringForOption: _displayStringForOption,
fieldViewBuilder: (BuildContext context,
TextEditingController textEditingController,
FocusNode focusNode,
VoidCallback onFieldSubmitted) {
return TextFormField(
controller: textEditingController,
focusNode: focusNode,
onFieldSubmitted: (String value) {
onFieldSubmitted();
},
);
},
optionsViewBuilder: (BuildContext context,
AutocompleteOnSelected<Product> onSelected,
Iterable<Product> options) {
return Align(
alignment: Alignment.topLeft,
child: Material(
elevation: 4.0,
child: SizedBox(
height: 200.0,
child: ListView.builder(
padding: const EdgeInsets.all(8.0),
itemCount: options.length,
itemBuilder: (BuildContext context, int index) {
final Product option = options.elementAt(index);
return Builder(
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
print(Scaffold.of(context).hasAppBar);
refreshList(
context,
operation: 'add',
option,
);
},
child: ListTile(
title: InkWell(
child: Text(_displayStringForOption(option) +
" Price Kes. ${option.price}")),
leading: Image.network(
"http://192.168.1.38/ci/uploads/${option.image}",
errorBuilder: (context, error, stackTrace) {
return Container(
child:
Image.asset("assets/images/camera.png"),
);
},
),
),
);
},
);
},
),
),
),
);
},
),```
这显示了颤振自动完成中的小吃栏
RawAutocomplete<Product>(
optionsBuilder: (TextEditingValue textEditingValue) {
return myProducts!.where((Product option) {
// Search based on User.toString, which includes both name and
// email, even though the display string is just the name.
return option.toString().contains(textEditingValue.text.toLowerCase());
});
},
displayStringForOption: _displayStringForOption,
fieldViewBuilder: (BuildContext context, TextEditingController textEditingController, FocusNode focusNode,
VoidCallback onFieldSubmitted) {
return TextFormField(
controller: textEditingController,
focusNode: focusNode,
onFieldSubmitted: (String value) {
onFieldSubmitted();
},
);
},
optionsViewBuilder:
(BuildContext ctx, AutocompleteOnSelected<Product> onSelected, Iterable<Product> options) {
return Align(
alignment: Alignment.topLeft,
child: Material(
elevation: 4.0,
child: SizedBox(
height: 200.0,
child: ListView.builder(
padding: const EdgeInsets.all(8.0),
itemCount: options.length,
itemBuilder: (BuildContext ct, int index) {//<---here
final Product option = options.elementAt(index);
return Builder(//<---here
builder: (BuildContext c) {
return GestureDetector(
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('${option.toString()}
selected'), duration: const Duration(seconds: 3)));
refreshList(
context,
operation: 'add',
option,
);
},
child: ListTile(
title: InkWell(
child: Text(_displayStringForOption(option) + " Price Kes. ${option.price}")),
leading: Image.network(
"http://192.168.1.38/ci/uploads/${option.image}",
errorBuilder: (context, error, stackTrace) {
return Container(
child: Image.asset("assets/images/camera.png"),
);
},
),
),
);
},
);
},
),
),
),
);
},
)