Flutter и Firestore, обрабатывать данные из StreamBuilder - PullRequest
0 голосов
/ 05 ноября 2018

Я сейчас пытаюсь создать приложение, похожее на Quiz, для изучения этой среды.

Я реализовал Firebase Firestore для управления данными приложения. Из этого плагина трепетания документации я прочитал о привязке CollectionReference к ListView, и это было довольно легко.

Моя проблема в следующем. У меня есть несколько категорий для отображения на домашней странице, я хочу, чтобы пользователь мог выбрать, какую из них он хочет, и затем сохранить эту информацию в списке.

С этим кодом я могу отобразить список:

@override


Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('Categorie').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Center(
              child: Column(
                children: <Widget>[
                  SizedBox(
                    child: CircularProgressIndicator(),
                    height: 50.0,
                    width: 50.0,
                  ),
                  Text('Dowload delle categorie...')
                ],
              ),
            );
          default:
            _loadListOfCategories(snapshot);
            return new ListView(
              children:
                  snapshot.data.documents.map((DocumentSnapshot document) {
                var nome = document['Nome'];
                print('doc: $nome');
                return new CategoryWidget(
                  id: document.documentID,
                  tap: onCategoryTap,
                  nome: document['Nome'],
                  count: document['Count'],
                  checked: false,
                );
              }).toList(),
            );
        }
      },
    );
  }

CategoryWidget - это простой виджет без сохранения состояния, который действует как ListTile.

Результат следующий:

Home page

Теперь, как я могу сохранить Список, полный моделей категорий, в котором реализовано свойство «проверено / не проверено», и как сохранить этот Список обновленным?

Я пытался использовать метод "_loadListOfCategories ()" точно внутри компоновщика:

  void _loadListOfCategories(AsyncSnapshot<QuerySnapshot> snapshot) {
    var temporalList = new List<CategoryModel>();
    for (DocumentSnapshot doc in snapshot.data.documents) {
      temporalList.add(new CategoryModel(
          id: doc.documentID,
          count: doc['Count'],
          nome: doc['Nome']));
    }
    setState(() {
      _listOfCategories = temporalList;
    });
  }

Но я не смог вызвать setState (), потому что я на самом деле внутри метода построения.

1 Ответ

0 голосов
/ 06 ноября 2018

используйте карту, ваш ключ будет 'document.documentID' и значение логическое.

Map map = Map () // предполагается, что это строка document.documentID

проверено: map.get (document.documentID), в вашем флажке вы звоните SetState () => map.put (document.documentID,! map.get (document.documentID));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...