我已经为学习Firebase创建了一个简单的演示页面,
这里我有一个文本字段、搜索按钮和StreamBuilder,用于显示所有记录
我已经设置了一个条件,当文本字段为空时显示所有记录...
在这里,我使用了一个刚刚重新生成的按钮...只是在它内部按下了setState
一切都很好,但我只是想改善记录应该是过滤的同时在文本框上打字,这样就不需要按钮了.
如何在文本字段Change中调用StreamBuilder的流...此外,我还创建了CustomTextField,因此如何将函数作为onChange传递需要一个值...
以下是我的代码
Column(
children: [
SizedBox(
height: 40,
),
CustomTextField(
hint: 'Search Email', controller: txtsearchcontroller),
SizedBox(
height: 20,
),
CupertinoButton(
child: Text('Search'),
onPressed: () {
setState(() {});
}),
SizedBox(
height: 30,
),
StreamBuilder(
stream: txtsearchcontroller.text == ''
? FirebaseFirestore.instance
.collection('chatusers')
.snapshots()
: FirebaseFirestore.instance
.collection('chatusers')
.where(
"email",
isEqualTo: txtsearchcontroller.text,
isNotEqualTo: widget.usermodel.email,
)
.snapshots(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.hasData) {
QuerySnapshot querysnapshot =
snapshot.data as QuerySnapshot;
if (querysnapshot.docs.length > 0) {
//and suggest me if any better way instead of this following
List<Map<String, dynamic>> maplist = [];
for (int x = 0; x < querysnapshot.docs.length; x++) {
Map<String, dynamic> usermap = querysnapshot.docs[x]
.data() as Map<String, dynamic>;
maplist.add(usermap);
}
return Expanded(
child: CustomListView(maplist:maplist),
);
} else {
return Text('Has Data but No user Found');
}
} else {
if (snapshot.hasError) {
return Text('error found');
} else {
return Text('empty..');
}
}
} else {
return CircularProgressIndicator();
}
}),
这是我的CustomTextfield
class CustomTextField extends StatelessWidget {
final String hint;
final bool isitpassword;
final TextEditingController controller;
const CustomTextField({Key? key,required this.hint,this.isitpassword=false,required this.controller}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 20),
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(20),
),
child: TextField(
style: TextStyle(
fontSize: 20,color: Colors.white,),
controller: controller,
obscureText: isitpassword,
decoration: InputDecoration(
border: InputBorder.none,
hintText: hint,
suffixIcon: IconButton(icon: Icon(Icons.close,color: Colors.white,),onPressed: (){
controller.text='';
},),
),
)),
);
}
}