Firebase列表未在设置状态下更新

时间:2018-12-20 11:03:01

标签: firebase flutter google-cloud-firestore

从Firebase检索后,Flutter setState函数不会更新列表。

我正在尝试开发Flutter应用。我没有在setState()函数中更新列表。该列表已成功从Firebase检索。我已将Firebase连接写在Services.dart文件中。

但是我的方法_getList()没有在main.dart文件中获取值。

main.dart

    class DetailsPageState extends State<DetailsPage> {

    List<Product> list;

        @override
    void initState() {
        _checkUser();  // for getting user id from firebase auth
    }

        @override
    Widget build(BuildContext context) {
            return new Scaffold(
                body: new Container(
                    child:new Text("data");
                );
            )
    }

    void _checkUser(){
        debugPrint("Entering in _checkUser");
        this.firebaseAuth.onAuthStateChanged.listen((firebaseUser)async{
            _getList(firebaseUser.uid);
        });
    }


    void _getList(String id)
    debugPrint("Entering in _getList");
        Services.retrieveItems(firestore, uid).then((onValue){
                setState(() {
                    list=onValue;
                        debugPrint("items list:"+onValue.length.toString());
                        debugPrint("items list:"+listCart.length.toString());
                });
        });
        }
    }

Services.dart

    static Future<List> retrieveItems(Firestore firestore, String userId) async {
        List<Product> items = new List<Product>();
        try {
        firestore.collection("Items").document(userId)
        .collection("ItemsMain").snapshots().listen((QuerySnapshot snapshot)  {
            List docList = snapshot.documents;
            items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
            debugPrint("items:"+items.length.toString());
            //return items;
        });
        } on Exception catch (e) {
        print (e.toString());
        }

        debugPrint("items 2:"+items.length.toString());
        return items;
    }

预期结果:

输入_checkUser

输入_getList

项目:6

项目2:6

商品列表:6

商品列表:6

实际结果:

输入_checkUser

输入_getList

物品清单:0

物品清单:0

项目2:0

项目:6

1 个答案:

答案 0 :(得分:1)

您要在加载项目之前返回它们。解决此问题的最简单方法是在await中使用retrieveItems等待从Firestore加载数据:

static Future<List> retrieveItems(Firestore firestore, String userId) async {
    List<Product> items = new List<Product>();
    var snapshot = await firestore.collection("Items").document(userId)
                                  .collection("ItemsMain").getDocuments()
    List docList = snapshot.documents;
    items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
    debugPrint("items:"+items.length.toString());

    return items;
}

您会注意到我:

  • 致电get()而不是listen()。由于listen()开始主动监视集合,因此无法确定何时“完成”。另一方面,get()仅返回一次文档,然后完成。
  • 删除了异常处理,只是为了使代码更具可读性。但我也建议仅在实际处理异常时才在此类功能代码中添加异常处理程序。保留“日志并继续”处理程序以获取更高级别的代码,例如您的主要方法。