Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 初始化处于初始状态的变量_Firebase_Flutter_Google Cloud Firestore - Fatal编程技术网

Firebase 初始化处于初始状态的变量

Firebase 初始化处于初始状态的变量,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我正在初始化initState(){}中的一个变量: @override void initState() { getDataFromFirestore(); super.initState(); }); } 该方法简单,基本上从Firestore获取数据,用数据填充对象“\u markerMap”。然后将此属性用作小部件中的属性。这个小部件在我的build方法中被调用 Widget build(BuildContext context) { retu

我正在初始化
initState(){}
中的一个变量:

@override
  void initState() {
    getDataFromFirestore();
    super.initState();

    });
  }
该方法简单,基本上从Firestore获取数据,用数据填充对象“\u markerMap”。然后将此属性用作小部件中的属性。这个小部件在我的
build
方法中被调用

Widget build(BuildContext context) {
    return new Scaffold(
      body: MyWidget(
            markerMap: _markerMap)
     );
  ....
 }
MyWidget是一个日历。markerMaps为日历上的某些日期添加图标。标记只是有时添加到日历中。因此,故障是间歇性的。可以安全地假设,在
initState()
中,数据将从firestore加载,以从firestore初始化变量。你有没有想过会发生什么,为什么日历上只会出现标记

在设置了标记映射的位置添加代码

getDataFromFirestore() async {
    await FirebaseAuth.instance.currentUser().then((user) {
      Firestore.instance.collection('availableDates').where('bandId', isEqualTo: user.uid).snapshots().listen(
              (data) => data.documents.forEach((doc) => _markerMap.add(
              doc['availableDates'].toDate(),
              Event(
                  date:doc['availableDates'].toDate(),
                  title: 'hello',
                  icon: _presentIcon(doc['availableDates'].toDate().day.toString())))));
      setState(() {});
    }).catchError((onError){
    });
  }

在initState中初始化变量没有错,除非它们是静态的。现在发生的事情是,您最初声明了_markerMap,但它只会在一些异步函数getDataFromFirestore()之后初始化,这可能需要几秒钟。这里您已经分配了
markerMap:_markerMap
,但最初_markerMap为null,并且仅在getDataFromFirestore()函数之后进行初始化。因此,检查null是一种很好的做法

_markerMap!=null?MyWidget(
            markerMap: _markerMap):Container();

或者提供一个默认值

,正如我从您的
getDataFromFirestore
方法中所看到的那样,您在获取用户对象(
FirebaseAuth.instance.currentUser()
调用)之后立即执行小部件重建(
setState
调用)

但是,您可以稍后修改
\u markerMap
变量-仅当
Firestore.instance.collection
查询完成时。在这种情况下,
setState
当前调用的位置是多余的

listen
回调函数中调用
setState
可以解决问题

e、 g

final _markerMap={};
getDataFromFirestore()异步{
等待FirebaseAuth.instance.currentUser()。然后((用户){
Firestore.instance
.collection('availableDates')
.where('bandId',isEqualTo:user.uid)
.快照()
.listen((数据)=>data.documents.forEach((文档){
setState((){//这里是setState调用
_markerMap.add(
文档['availableDates'].toDate(),
事件(
日期:doc['availableDates'].toDate(),
标题:“你好”,
图标:_presentIcon(doc['availableDates'].toDate().day.toString())
)
);
});
}));
}).catchError((onError){});
}

请仔细检查此示例代码。我的一般建议是正确的,但是我没有在我这方面进行测试。

请发布一些关于如何准确设置
\u markerMap
变量的代码。刚刚编辑了问题并在设置了_markerMap的地方添加了代码。我如何确保_markerMap不为null,并且仅在_markerMap从Firestore\u markerMap获取值之后才调用构建=null?MyWidget(markerMap:_markerMap):Container();您可以在代码中放置循环进度条或一些加载程序,以显示直到您获得数据,而不是空容器。您还可以从getDataFromFirestore调用中存储未来,并使用FutureBuilder。刚才注意到,为了获得更好的结果,您可以将
setState
向上移动一级,从而得到包装的
forEach
。e、 g.
setState((){data.documents.forEach(…);})