Отображение data
В firestore есть коллекция которую отображаю в DataTable. Так же там присутствует функция onTap через которую я пытаюсь показать данные моего продукта. Данные должны показываться в showDialog().
return StreamBuilder<List<Product>>(
stream: ProductService().products,
builder: (context, snapshot) {
if (snapshot.hasData) {
return DataTable(
columns: [
DataColumn(
label: Text('Наименование'),
),
],
rows: snapshot.data.map((products) {
return DataRow(cells: [
DataCell(
Text(products.name),
onTap: () => showDialog(
context: context,
builder: (context) => ProductDetails(),
)
),
DataCell(Text(products.date)),
DataCell(Text(products.category)),
]);
}).toList(),
);
showDialog возвращает виджет ProductDetails.
Widget build(BuildContext context) {
return StreamBuilder<Product>(
stream: ProductService().productDetails,
builder: (context, snapshot) {
if (snapshot.hasData) {
Product productDetails = snapshot.data;
return Dialog(
child: Container(
width: 500,
height: 500,
child: Form(
key: _formProductDetails,
child: Column(
children: <Widget>[
TextFormField(
initialValue: productDetails.name,
),
],
),
),
),
);
else {
return Text('error');
}
класс продукта
class ProductService {
var dbTimeKey = DateTime.now();
var formatDate = DateFormat('dd-MM-yyyy HH:mm:ss');
final CollectionReference _firestore =
Firestore.instance.collection("products");
Future addProduct(_nameproductController, _priceproductController,
_productQuantityController, _currentCategory, url, bool isActive) async {
String date = formatDate.format(dbTimeKey);
_firestore.document(date).setData({
'name': _nameproductController,
'price': _priceproductController,
'category': _currentCategory,
'image': url,
'date': date,
'quantity': _productQuantityController,
'isActive': true,
});
}
List<Product> _productList(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return Product(
name: doc.data['name'] ?? '',
price: doc.data['price'] ?? '0',
category: doc.data['category'] ?? '',
quantity: doc.data['quantity'] ?? '0',
date: doc.data['date'] ?? '',
image: doc.data['image'] ?? '',
isActive: doc.data['isActive'] ?? '',
);
}).toList();
}
Stream<List<Product>> get products {
return _firestore.snapshots().map(_productList);
}
Product productDetailsFromSnap(DocumentSnapshot snapshot) {
return Product(
name: snapshot.data['name'],
price: snapshot.data['price'],
category: snapshot.data['category'],
quantity: snapshot.data['quantity'],
date: snapshot.data['date'],
image: snapshot.data['image'],
isActive: snapshot.data['isActive'],
);
}
Stream<Product> get productDetails {
return _firestore.document().snapshots().map(productDetailsFromSnap);
}
}
проблема такова, что при нажатии на наименование продукта который должен открывать окно и показывать детали продукта возвращает error. Виджет productdetails не понимает с какого документа вытаскивать информацию.
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Будет как-то так (написал по памяти, возможно где-то будут ошибки, которые вы сможете исправить). Если есть вопросы, спрашивайте!
Main:
return StreamBuilder<List<Product>>(
stream: ProductService().products,
builder: (context, snapshot) {
if (snapshot.hasData) {
return DataTable(
columns: [
DataColumn(
label: Text('Наименование'),
),
],
rows: snapshot.data.map((products) {
return DataRow(cells: [
DataCell(
Text(products.name),
onTap: () => showDialog(
context: context,
builder: (context) => ProductDetails(products),
)
),
DataCell(Text(products.date)),
DataCell(Text(products.category)),
]);
}).toList(),
);
ProductDetails:
class ProductDetails extends StatefulWidget {
final Product product;
ProductDetails(this.product);
@override
createState() => new ProductDetailsState(product);
}
class ProductDetailsState extends State<ProductDetails> {
final Product product;
ProductDetailsState(this.product);
...
Widget build(BuildContext context) {
return Dialog(
child: Container(
width: 500,
height: 500,
child: Form(
key: _formProductDetails,
child: Column(
children: <Widget>[
TextFormField(initialValue: product.name),
],
),
),
),
);
}
}
ProductService:
class ProductService {
var dbTimeKey = DateTime.now();
var formatDate = DateFormat('dd-MM-yyyy HH:mm:ss');
final CollectionReference _firestore =
Firestore.instance.collection("products");
Future addProduct(_nameproductController, _priceproductController,
_productQuantityController, _currentCategory, url, bool isActive) async {
String date = formatDate.format(dbTimeKey);
_firestore.document(date).setData({
'name': _nameproductController,
'price': _priceproductController,
'category': _currentCategory,
'image': url,
'date': date,
'quantity': _productQuantityController,
'isActive': true,
});
}
List<Product> _productList(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return Product(
name: doc.data['name'] ?? '',
price: doc.data['price'] ?? '0',
category: doc.data['category'] ?? '',
quantity: doc.data['quantity'] ?? '0',
date: doc.data['date'] ?? '',
image: doc.data['image'] ?? '',
isActive: doc.data['isActive'] ?? '',
);
}).toList();
}
Stream<List<Product>> get products {
return _firestore.snapshots().map(_productList);
}
}