Флаттер Как перейти в documents.length из Firestore другим способом? - PullRequest
1 голос
/ 18 октября 2019

У меня есть метод , который принимает значение int, которое должно быть значением длины поля array в документе в collection in Cloud Firestore .

Я очень новичок в Flutter и особенно в Firestore, и я полагаю, что это как-то связано с тем, как работают фьючерсы, запросы и потоки,но я не могу понять это правильно.

Это то, что я пытаюсь достичь:

class UserBookmarksSection extends StatefulWidget {
  @override
  _UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}

class _UserBookmarksSectionState extends State<UserBookmarksSection> {  
  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,      
      children: <Widget>[
        HeadlineItem(title: "Your bookmarks"), 
        StreamBuilder(
          stream: Firestore.instance.collection("brites").snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) return const Text("Loading...");
            return Column(
              children: populateBriteList(snapshot, x, true), //Here I want to pass in the length of the array in firestore into x
            );
          }
        ),
      ],
    );
  }
}

В основном я пытался создать метод, который возвращает Future<int> и пытался передать это, но это не сработало, потому что Future<int> не совпадает с типом int. Это я понимаю, но решение мне не понятно.

1 Ответ

1 голос
/ 19 октября 2019

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

В этом случае вы можете получить значение длины закладок в initState. Вы переопределите метод initState () класса состояний, а затем вызовете асинхронный метод, который извлекает значение из базы данных. (Состояние инициализации не может быть асинхронным). Как только значение получено, вы можете вызвать setState (), чтобы обновить виджет со значением закладок, установленным как int.

Может выглядеть примерно так:

class UserBookmarksSection extends StatefulWidget {
  @override
  _UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}

class _UserBookmarksSectionState extends State<UserBookmarksSection> {  
  int bookmarksLength;

  @override
  void initState(){
    super.initState();
    getBookmarksLength();
  }

  Future<void> getBookmarksLength() async {
    bookmarksLength = await getArrayLength(id);
    setState((){});
  }

  @override
  Widget build(BuildContext context) {
    if(bookmarksLength == null) return CircularProgressIndicator();
    else return Column(
      crossAxisAlignment: CrossAxisAlignment.start,      
      children: <Widget>[
        HeadlineItem(title: "Your bookmarks"), 
        StreamBuilder(
          stream: Firestore.instance.collection("brites").snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) return const Text("Loading...");
            return Column(
              children: populateBriteList(snapshot, bookmarksLength, true), 
            );
          }
        ),
      ],
    );
  }
}


Firestore firestore = Firestore.instance;

Future<int> getArrayLength(String documentId) async {
  DocumentSnapshot snapshot = await firestore.collection('collection').document(documentId).get();
  return snapshot.data['array'].length;
}

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

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