ошибка при выполнении поиска с использованием облачного firestore во флаттере - PullRequest
0 голосов
/ 27 декабря 2018

У меня проблемы с получением результата поиска.У меня есть некоторые данные в облаке firestore, я хочу выполнить поиск по этим данным.Вот снимок экрана с данными, но когда я ищу, я не могу получить никаких данных.

here is the data on which i want to perform searching

и вот код ...

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:reminder/searchservice.dart';

class MySearchPage extends StatefulWidget {
  @override
  _MySearchPageState createState() => new _MySearchPageState();
}

class _MySearchPageState extends State<MySearchPage> {
  var queryResultSet = [];
  var tempSearchStore = [];

  initiateSearch(value) {
    if (value.length == 0) {
      setState(() {
        queryResultSet = [];
        tempSearchStore = [];
      });
    }

    var capitalizedValue =
        value.substring(0, 1).toUpperCase() + value.substring(1);

    if (queryResultSet.length == 0 && value.length == 1) {
      SearchService().searchByName(value).then((QuerySnapshot docs) {
        for (int i = 0; i < docs.documents.length; ++i) {
          queryResultSet.add(docs.documents[i].data);
        }
      });
    } else {
      tempSearchStore = [];
      queryResultSet.forEach((element) {
        if (element['email'].startsWith(capitalizedValue)) {
          setState(() {
            tempSearchStore.add(element);
          });
        }
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: Text('Search Here'),
        ),
        body: ListView(children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: TextField(
              onChanged: (val) {
                initiateSearch(val);
              },
              decoration: InputDecoration(
                  prefixIcon: IconButton(
                    color: Colors.black,
                    icon: Icon(Icons.arrow_back),
                    iconSize: 20.0,
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  ),
                  contentPadding: EdgeInsets.only(left: 25.0),
                  hintText: 'Search by Email',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0))),
            ),
          ),
          SizedBox(height: 10.0),
          GridView.count(
              padding: EdgeInsets.only(left: 10.0, right: 10.0),
              crossAxisCount: 2,
              crossAxisSpacing: 4.0,
              mainAxisSpacing: 4.0,
              primary: false,
              shrinkWrap: true,
              children: tempSearchStore.map((element) {
                return buildResultCard(element);
              }).toList())
        ]));
  }
}

Widget buildResultCard(data) {
  return Card(
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      elevation: 2.0,
      child: Container(
          child: Center(
              child: Text(data['email'],
                textAlign: TextAlign.center,
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 20.0,
                ),
              )
          )
      )
  );
}

и вот код услуги ...

import 'package:cloud_firestore/cloud_firestore.dart';

class SearchService {
  searchByName(String searchField) {
    return Firestore.instance
        .collection('task')
        .where('title',
        isEqualTo: searchField.substring(0, 1).toUpperCase())
        .getDocuments();
  }
}

1 Ответ

0 голосов
/ 27 декабря 2018

Полагаю, ваша ошибка в предложении .where.

Это очень проводное условие

.where('title', isEqualTo: searchField.substring(0, 1).toUpperCase())

И оно соответствует только в том случае, если у вас есть заглавная буква в 1 заглавную букву, соответствующую первой искомой букве.Поэтому я уверен, что ваш docs.documents.lenght равен 0.

Внимательно прочитайте Cluod Firestore query section.

  1. Вы можете использовать простой запрос, подобный этому:
.where('title', isGreaterThan: searchField)
Или, если вам нужен более сложный индексированный поиск, вы можете попробовать составные индексы .

Обзор индекса

Но если вы хотите сделать больше выводов в строке поиска (например, содержит и т. Д.), Сначала нужно выполнить запрос, а затем выполнить фильтрацию здесь:
for (int i = 0; i < docs.documents.length; ++i) {
    //TODO: do more sofisticated filtering here
}
Или, если хотите, вы можете создать дополнительные task field и заполнить это значение предварительно созданной вами "поисковой строкой", составленной таким образом, чтобы базовые запросы Cloud Firestore запрашивалидолжен вернуть то, что вы хотите.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...