Flutter将项目添加到列表

时间:2019-03-28 14:48:34

标签: list flutter google-cloud-firestore

我想将一个项目添加到列表中

__call__

但是如果我将列表的长度打印到控制台,它总是说,列表长为0 ...

help

有任何建议吗?

最好的问候

2 个答案:

答案 0 :(得分:1)

在添加项目后,尝试在forEach中添加print(userSearchItems.length);,您将看到实际长度。

答案 1 :(得分:1)

我将尝试解释这里的内容,请看下面的代码:

import 'dart:async';

void main() {
  List<int> userSearchItems = [];

  Timer _sendTimeOutTimer;

  const oneSec = Duration(seconds: 2);
  _sendTimeOutTimer = Timer.periodic(oneSec, (Timer t) {
    userSearchItems.add(1);
    print(userSearchItems.length); // result 1 and it will be executed after 2 seconds 
    _sendTimeOutTimer.cancel();
  });

  print(userSearchItems.length); // result 0 and it will be executed first
}

异步动作(Timer)内的打印将在2秒后执行,这意味着异步动作结束后,但异步动作(Timer)之外的打印将不等待2秒直接执行,在您这种情况下异步操作正在监听数据.listen((data) =>,因此,如果您在异步操作之外打印长度,您将看不到所发送的内容,因为尚未添加该项。

解决方案:您可以创建函数witch return Future,然后等到完成后再打印长度。

List<UserSearchItem> userSearchItems = [];

Future<String> submitAll() async {

Firestore.instance
    .collection('insta_users')
    .snapshots()
    .listen((data) =>
    data.documents.forEach((doc){
      print(data.documents.length);

      User user = new User.fromDocument(doc);
      UserSearchItem searchItem = new UserSearchItem(user);
      userSearchItems.add(searchItem);
      print(user.bio);

      return 'success';
    }));
}

void yourFunction() async{
   await submitAll();
   print("Loaded");
   print(userSearchItems.length);
}

然后致电yourFunction()