flutter - 实施建议并选择它作为firestore?
问题描述
我想在字段中添加建议/自动完成列表以显示 Firestore 数据并从建议列表中选择以完成该字段,
我尝试使用几个包来实现类似flutter_typeahead,但它适用于本地列表(商品1 )但它不适用于firestore数据(商品2 )......有什么帮助吗?
我的代码
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var _selectedCommodity1;
var _selectedCommodity2;
TextEditingController commodityFiled1 = TextEditingController();
TextEditingController commodityFiled2 = TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: const Text("QFS"),
),
body: Form(
child: Container(
padding: const EdgeInsets.only(
top: 5, bottom: 10, right: 20, left: 20),
child: Column(children: [
TypeAheadFormField(
textFieldConfiguration: TextFieldConfiguration(
controller: commodityFiled1,
decoration: const InputDecoration(
labelText: 'Commodity1',
icon: Icon(
Icons.receipt_rounded,
color: Colors.black87,
))),
suggestionsCallback: (pattern) {
return CommodityService.getSuggestions(pattern);
},
itemBuilder: (context, String suggestion) {
return ListTile(
title: Text(suggestion),
);
},
transitionBuilder:
(context, suggestionsBox, controller) {
return suggestionsBox;
},
onSuggestionSelected: (String suggestion) {
commodityFiled1.text = suggestion;
},
onSaved: (value) => _selectedCommodity1 = value!,
),
TypeAheadFormField(
textFieldConfiguration: TextFieldConfiguration(
controller: commodityFiled2,
decoration: const InputDecoration(
labelText: 'Commodity2',
icon: Icon(
Icons.receipt_rounded,
color: Colors.black87,
))),
suggestionsCallback: (pattern) {
return getSuggestion(pattern);
},
itemBuilder: (context, suggestion) {
return ListTile(
title: Text(suggestion.toString()),
);
},
transitionBuilder:
(context, suggestionsBox, controller) {
return suggestionsBox;
},
onSuggestionSelected: (suggestion) {
commodityFiled2.text = suggestion.toString();
},
onSaved: (value) => _selectedCommodity2 = value!,
),
])))));
}
static getSuggestion(String suggestion) async =>
await FirebaseFirestore.instance
.collection("QFS")
.where('commodity', isEqualTo: suggestion)
.get()
.then((snap) {
return snap.docs;
});
}
class CommodityService {
static final List<String> commodity = [
'Banana',
'Mango',
'Orange',
];
static List<String> getSuggestions(String query) {
List<String> matches = [];
matches.addAll(commodity);
matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
return matches;
}
}
我的 firstore 收藏图片:https ://nimb.ws/1tKDQb
解决方案
您可以使用关键字查询 Firestore。因此,基本上无论何时从用户那里获得搜索关键字(在按键或使用 debounce 时),您都可以过滤 Firestore 文档并显示相关建议以及您作为响应返回的列表。
要了解有关通过 where checkout 使用 Firestore 查询的更多信息:https ://firebase.flutter.dev/docs/firestore/usage/#filtering
推荐阅读
- google-cloud-platform - 如何将其他路由通告到现有 BGP 对等体?
- javascript - 如何在 JupyterLab 中使用 javascript 设置 python 变量
- docker - Docker - 80 以外的 nginx 端口映射不起作用
- angular - 表单内组件的模板驱动表单验证
- r - 在 macOS 上安装 data.table:带 M1 芯片的 Big Sur
- google-sheets - 获取动态范围的每个“部分”的小计
- fish - 为什么我的 strace 命令不适用于鱼?
- android - 在视频播放器android上显示后退按钮
- python - 如何使用 owlready (python) 获取 wikidata 以生成本体?
- spring - 在 Spring 项目(不是 Spring Boot)上配置 Open API 3