繁体   English   中英

flutter 在 firestore 中搜索两个项目

[英]flutter search in firestore for two items

我正在开发一个带有 flutter 的机票预订应用程序,我正在尝试从 Firestore 添加一个搜索查询以获取起点和目的地。 基本上这个想法是让用户通过搜索选择他的起点和目的地位置,当他 select 他的起点站时,它将存储在所选项目中,并且不再在目的地项目中找到该特定项目。

你能告诉我如何完成这个任务吗?

您可以使用以下代码实现搜索文本:

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.
    );
  }
}

您可以像这样在代码中使用限制FirebaseFirestore.instance.collection('test').limit(2).get()并且您只会得到两个元素

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM