Извлечение всех записей из базы данных (Firestore) в список с использованием модели - PullRequest
0 голосов
/ 04 апреля 2019

Попытка получить список из магазина, используя модель, которая работает без модели, но не с ней.

В StatefulWidget я получил пустой список продуктов. в основном происходит от модели, как это

class Product {
  int id;
  String title, price, message;
  Product(this.id, this.title, this.price, this.message);
}

Список таких товаров

import 'package:presentation_app/models/product.dart';

class _ProductsListState extends State<ProductsList> {

  List<Product> products = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
...

затем добавил StreamBuilder с коллекцией firestore, подобной этой

StreamBuilder(
          stream: Firestore.instance.collection('products').snapshots(),
          builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
            if (!snapshot.hasData) return CircularProgressIndicator();
            return BuildListView(products);
          }
      ),

и в классе BuildListView я назвал список продуктов и использовал его следующим образом:

class BuildListView extends StatelessWidget {

  final List<Product> products;
  BuildListView(this.products);

в listViewBuilder Затем я попытался получить доступ к данным следующим образом:

ListView.builder(
      itemCount: products.length,
      itemBuilder: (BuildContext context, int index) {

        int id = products[index].id;
        String title = products[index].title;
        String message = products[index].message.toString();
        String price = products[index].price.toString();

Я получаю CircularProgressIndicator, но после завершения загрузки ничего не появляется.

, используя этот подход, он работает, но, конечно, не с моделью

      body: StreamBuilder(
          stream: Firestore.instance.collection('products').snapshots(),
          builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
            if (!snapshot.hasData) return CircularProgressIndicator();
            return BuildListView(products: snapshot.data.documents);
          }
      ),
    );
  }
}

class BuildListView extends StatelessWidget {

  final List<DocumentSnapshot> products;

  BuildListView({this.products});
...

1 Ответ

0 голосов
/ 08 июля 2019

В этом случае model не требуется, потому что я не работал с бизнес-логикой, поэтому model устарел, если используется Bloc и db, как firebase, bloc с использованием model должно выглядеть примерно так.

  Future<void> createData(docId) {

    final Tracker createTracker = Tracker(
        id: docId,
        comment: _commentController.value,
        exercise: _exerciseController.value,
        number: _numberController.value,
        repetition: _repetitionController.value,
        sets: _setsController.value,
        weight: _weightController.value
    );

    print(_commentController.value + _numberController.value.toString());

    return trackerDb.createData(docId, createTracker);
  }

и модель БД для создания данных, например, вот так.

  Future createData(String docId, Tracker tracker) async {
    await db.document(docId).setData(convertTrackerToMap(tracker));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...