# #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. Во-первых, вы пытаетесь реализовать себя, и если это не работает, то мы здесь, чтобы помочь. 🙂