我正在开发一款轻巧的机票预订应用程序,并且试图从Firestore添加搜索查询来查询起点和终点。基本上,这个想法是让用户通过搜索来选择自己的出发地和目的地,当他选择自己的出发站时,它将存储在选定的项目中,并且不再在目的地项目中找到该特定项目。
您能告诉我如何完成这项任务吗?
答案 0 :(得分:0)
您可以使用以下代码实现搜索文本:
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:trackingsystem/Director/Director_View_Job_Details.dart';
class DirectorViewJob extends StatefulWidget {
@override
_DirectorViewJobState createState() => new _DirectorViewJobState();
}
class _DirectorViewJobState extends State<DirectorViewJob> {
var jobTitle = [];
var jobDescription = [];
var jobSalary = [];
var jobExperience = [];
var jobDeadlineDate = [];
var companyName = [];
bool dataCheck = false;
bool isLoading = false;
var jobDetails;
var id;
var documnet = [];
List products = [];
var productId = [];
var deleteTitle;
void getJobs() async {
setState(() {
isLoading = true;
});
Firestore.instance
.collection("CreateJob")
.getDocuments()
.then((querySnapshot) {
querySnapshot.documents.forEach((result) {
id = result.documentID;
products.add(result.data['Job Details']);
documnet.add(id);
jobDetails = (result.data["Job Details"]);
jobTitle.add(jobDetails['title']);
jobDescription.add(jobDetails['description']);
jobSalary.add(jobDetails['salary']);
jobDeadlineDate.add(jobDetails['date']);
print("date $jobDeadlineDate");
jobExperience.add(jobDetails['Experience_Level']);
companyName.add(jobDetails['companyName']);
if (jobDetails.isNotEmpty) {
setState(() {
dataCheck = true;
});
} else {
isLoading = true;
}
});
setState(() {
isLoading = false;
});
});
}
searchJob(q) {
print(q);
print('products $products');
for (int i = 0; i < products.length; i++) {
if (products[i]['title'] == "$q") {
setState(() {
jobTitle.clear();
jobSalary.clear();
jobDescription.clear();
jobDeadlineDate.clear();
jobTitle.add(products[i]['title']);
jobDescription.add(products[i]["description"]);
jobSalary.add(products[i]['salary']);
jobDeadlineDate.add(products[i]['date']);
});
}
}
}
@override
void initState() {
getJobs();
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.blueGrey[600],
title: Text(
"Jobs",
style: TextStyle(fontFamily: 'Righteous'),
),
),
backgroundColor: Colors.white,
body: isLoading
? SpinKitDoubleBounce(
color: Colors.blueGrey,
)
: Center(
child: ListView(
children: dataCheck
? <Widget>[
SizedBox(
height: 20,
),
SizedBox(
height: 10,
),
Container(
child: TextField(
// controller: _searchQueryController,
autofocus: true,
decoration: InputDecoration(
labelText: "Search Job",
hintText: "Search",
prefixIcon: Icon(
Icons.search,
color: Colors.blueGrey[400],
),
fillColor: Colors.white,
border: new OutlineInputBorder(
borderRadius:
new BorderRadius.circular(25.0),
borderSide: new BorderSide(),
),
//fillColor: Colors.green
),
style: TextStyle(
color: Colors.blueGrey[300],
fontSize: 16.0),
onChanged: (query) => {searchJob(query)},
),
),
SizedBox(
height: 10,
),
Container(
decoration: BoxDecoration(
// color: Colors.lightGreen[100],
),
child: new ListView.builder(
shrinkWrap: true,
physics: BouncingScrollPhysics(),
itemCount: jobTitle?.length ?? 0,
itemBuilder: (BuildContext context, index) {
return InkWell(
splashColor: Colors.white,
onTap: () async {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) =>
DirectorJobDetails(
jobDetailName:
jobTitle[index],
jobDetailDescription:
jobDescription[
index],
jobDetailExperience:
jobExperience[
index],
jobDetailDate:
jobDeadlineDate[
index],
jobDetailSalary:
jobSalary[index],
jobDetailCompany:
companyName[index],
documentId:
documnet[index],
)),
);
},
child: new Card(
color: Colors.blueGrey[200],
elevation: 5,
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(30.0),
),
child: Container(
decoration: BoxDecoration(),
child: ListTile(
leading: Icon(Icons.work,
size: 40),
title: Text(jobTitle[index],
style: TextStyle(
color: Colors.black,
fontSize: 23.0,
// fontWeight: FontWeight.bold,
fontFamily:
'Righteous',
//decoration: TextDecoration.none
)),
subtitle: Row(children: [
SizedBox(
height: 10,
),
Expanded(
child: Text(
"Salary : ${jobSalary[index]}",
style: TextStyle(
color:
Colors.black,
fontSize: 18.0,
// fontWeight: FontWeight.bold,
fontFamily:
'Righteous',
//decoration: TextDecoration.none
)),
),
Expanded(
child: Text(
"DeadLine Date : ${jobDeadlineDate[index]}",
style: TextStyle(
color:
Colors.black,
fontSize: 18.0,
// fontWeight: FontWeight.bold,
fontFamily:
'Righteous',
//decoration: TextDecoration.none
)),
)
]),
//
))));
}),
),
SizedBox(
height: 20,
)
]
: <Widget>[
Container(
padding: EdgeInsets.fromLTRB(
50.0, 100.0, 50.0, 50.0),
child: Center(
child: Text(
"No Jobs are available",
style: TextStyle(
color: Colors.black,
fontSize: 25.0,
fontWeight: FontWeight.bold,
fontFamily: 'Righteous',
//decoration: TextDecoration.none
),
),
))
]),
)),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}