I have gone through multiple searching tutorials and articles but unfortunately i couldn't find any search method that can support Realtime database logic search in flutter, so is there any simple way to search Reealtime database in a TextField?
Here is my code:
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:idevice_me/providers/project_provider.dart';
import 'package:idevice_me/screens/user_detail_screen.dart';
import 'package:provider/provider.dart';
class HomeWidget extends StatefulWidget {
const HomeWidget({ Key? key }) : super(key: key);
@override
State<HomeWidget> createState() => _HomeWidgetState();
}
class _HomeWidgetState extends State<HomeWidget> {
var _isInit = true;
@override
void didChangeDependencies(){
if(_isInit){
Provider.of<ProjectProvider>(context, listen: false).readData();
}
_isInit = false;
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
TextEditingController searchData = TextEditingController();
var dbRef = FirebaseDatabase.instance.ref();
return StreamBuilder(
stream: dbRef.child('users').onValue,
builder: (ctx, AsyncSnapshot snapshot){
if(snapshot.connectionState == ConnectionState.waiting){
return const Center(child: CircularProgressIndicator());
}
if(snapshot.hasData){
//----------------------------
//USERID comes from here
//----------------------------
final userSnapshot = snapshot.data!.snapshot.children.toList();
return Column(
children: [
const SizedBox(height: 20,),
Padding(
padding: const EdgeInsets.only(right: 15.0, left: 15.0),
child: TextField(
decoration: InputDecoration(
labelText: 'Search',
labelStyle: TextStyle(fontSize: 14,color: Colors.grey.shade400,fontWeight: FontWeight.w600),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: BorderSide(color: Colors.grey.shade300),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: const BorderSide(color: Colors.blue),
),
floatingLabelBehavior: FloatingLabelBehavior.auto,
),
key: const ValueKey('search'),
keyboardType: TextInputType.text,
controller: searchData,
),
),
const SizedBox(height: 10,),
// ignore: deprecated_member_use
FlatButton(
onPressed: (){
setState(() {
});
},
child: const Text('Search'),
textColor: Colors.white,
color: Colors.black,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
),
const Divider(),
const SizedBox(height: 20,),
Expanded(
child: ListView.builder(
itemCount: userSnapshot.length,
itemBuilder: (BuildContext ctx, i)=> Column(
children: [
// ignore: sized_box_for_whitespace
GestureDetector(
onTap: (){
Navigator.of(context).pushNamed(
UserDetailScreen.routeName,
//--------------------------------------
//USERID should be here through snapshot
//--------------------------------------
arguments: userSnapshot[i].key.toString(),
);
},
child: Column(
children: [
ListTile(
leading: const Icon(Icons.person),
title: Text(userSnapshot[i].child('username').value,),
subtitle: Text(userSnapshot[i].child('email').value,),
trailing: Text(userSnapshot[i].child('phone').value.toString()),
onTap: (){
Navigator.of(context).pushNamed(
UserDetailScreen.routeName,
arguments: userSnapshot[i].key.toString()
);
},
),
const Divider(),
],
),
),
],
)
),
),
],
);
}
return const Center(child: Text('There is something wrong!'),);
},
);
}
}
Hope someone did the Realtime database package search before :(. Please help!