трепещущий поиск в firestore для двух элементов

#flutter #google-cloud-firestore #full-text-search

#трепещущий #google-облако-firestore #полнотекстовый поиск

Вопрос:

Я разрабатываю приложение для бронирования авиабилетов с помощью flutter и пытаюсь добавить поисковый запрос из Firestore для начала и пункта назначения. по сути, идея заключается в том, чтобы пользователь мог выбрать свое начальное и конечное местоположение путем поиска, и когда он выберет свою начальную станцию, она будет сохранена в выбранном элементе, и этот конкретный элемент больше не будет найден в пунктах назначения.

можете ли вы показать мне, как выполнить эту задачу?

Ответ №1:

Вы можете реализовать поиск текста с помощью этого кода:

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

Комментарии:

1. как я могу использовать его с моими облачными предметами firestore (мои местоположения)?

2. Измените его соответствующим образом для ваших предметов, которые вы сохранили

Ответ №2:

Вы можете использовать limit в своем коде следующим образом: FirebaseFirestore.instance.collection(‘test’).limit(2).get(), и вы получите только два элемента