как реализовать панель поиска с использованием нескольких коллекций firestore

# #firebase #flutter #dart #google-cloud-firestore

Вопрос:

Здравствуйте, я пытаюсь создать приложение для электронной коммерции с четырьмя различными категориями(простыни, компьютеры, товары для ковриков и песка), и для каждой отдельной категории в firestore создаются отдельные коллекции с одинаковыми именами полей, пожалуйста, проверьте изображение здесь, введите описание изображения здесь. Теперь я хочу реализовать поиск по названию продукта со своей домашней страницы, но я знаю только, как реализовать поиск по одной коллекции firestore. Пожалуйста, проверьте и помогите мне, я новичок в флаттере, пожалуйста, подробно объясните и, если возможно, отредактируйте код, приведенный ниже. Спасибо.

обслуживание продукта

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:vanfly/modals/product_modal.dart';
class ProductServices {
  FirebaseFirestore _firestore = FirebaseFirestore.instance;

 
  Future<List<ProductModal>> searchProducts({String productName}) {
    // code to convert the first character to uppercase
    String searchKey = productName[0].toUpperCase()   productName.substring(1);
    return _firestore
        .collection('products')
        .orderBy("name")
        .startAt([searchKey])
        .endAt([searchKey   'uf8ff'])
        .get()
        .then((result) {
          List<ProductModal> products = [];
          for (DocumentSnapshot product in result.docs) {
            products.add(ProductModal.fromSnapshot(product));
          }
          return products;
        });
  }
}
 

поставщик продукции

 import 'package:flutter/material.dart';
import 'package:vanfly/modals/product_modal.dart';
import 'package:vanfly/services/product_service.dart';

class ProductProvider with ChangeNotifier {
  ProductServices _productServices = ProductServices();
 
  List<ProductModal> productsSearched = [];


  Future search({String productName}) async {
    productsSearched = await _productServices.searchProducts(
         productName: productName);

    notifyListeners();
  }
}
 

реализация панели поиска

 Container(
          decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.only(
                  bottomRight: Radius.circular(20),
                  bottomLeft: Radius.circular(20))),
          child: Padding(
            padding:
                const EdgeInsets.only(top: 8, left: 8, right: 8, bottom: 10),
            child: Container(
              decoration: BoxDecoration(
                border: Border.all(color: Colors.pink[100]),
                color: Colors.grey.withOpacity(0.2),
                borderRadius: BorderRadius.circular(20),
              ),
              child: ListTile(
                leading: Icon(
                  Icons.search,
                  color: Colors.pinkAccent,
                ),
                title: TextField(
                  textInputAction: TextInputAction.search,
                  onSubmitted: (pattern) async {
                    await productProvider.search(productName: pattern);
                    changeScreen(context, ProductSearchScreen());
                  },
                  decoration: InputDecoration(
                    hintText: "search...",
                    border: InputBorder.none,
                  ),
                ),
              ),
            ),
          ),
        ),
 

экран поиска

 import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:vanfly/common.dart';
import 'package:vanfly/providers/product_provider.dart';
import 'package:vanfly/screens/cart.dart';
import 'package:vanfly/screens/products_screen/details_page.dart';
import 'package:vanfly/screens/products_screen/products_page.dart';

class ProductSearchScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final productProvider = Provider.of<ProductProvider>(context);

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.pinkAccent,
        leading: IconButton(
            icon: Icon(Icons.close),
            onPressed: () {
              Navigator.pop(context);
            }),
        title: Text(
          "Result",
          style: TextStyle(fontSize: 20),
        ),
        elevation: 0.0,
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.shopping_cart),
              onPressed: () {
                changeScreen(
                  context,
                  Cart(),
                );
              })
        ],
      ),
      body: productProvider.productsSearched.length < 1
          ? Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Icon(
                      Icons.search,
                      color: Colors.grey,
                      size: 30,
                    ),
                  ],
                ),
                SizedBox(
                  height: 15,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      "No products Found",
                      style: TextStyle(
                          color: Colors.grey,
                          fontWeight: FontWeight.w300,
                          fontSize: 22),
                    ),
                  ],
                )
              ],
            )
          : ListView.builder(
              itemCount: productProvider.productsSearched.length,
              itemBuilder: (context, index) {
                return GestureDetector(
                    onTap: () async {
                      changeScreen(
                          context,
                          ProductDetails(
                              products:
                                  productProvider.productsSearched[index]));
                    },
                    child: SingleProduct(
                        product: productProvider.productsSearched[index]));
              }),
    );
  }
}
 

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

1. эй, пожалуйста, не могли бы вы помочь мне решить эту проблему.

2. В чем проблема с этим кодом?

3. пожалуйста, прочитайте описание. Я упомянул все в описании.

4. Это не проблема, это требование !!

5. Во-первых, вы пытаетесь реализовать себя, и если это не работает, то мы здесь, чтобы помочь. 🙂