Отображение 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);
  }
}
→ Ссылка