在initState()颤振中使用异步方法

时间:2019-08-13 09:57:13

标签: firebase flutter dart

我正在使用firebase,并且需要在我的initState()方法中获取用户的ID,因为我正在从Firebase构建需要用户ID的小部件。 firebase使用的currentUser方法是Future

目前,我将其作为初始化状态并使用getUser函数:

Future<FirebaseUser> getUser() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    return user;
  }

void initState() {
    getUser().then((result) {
      stream = Firestore.instance.collection('Lessons').where("teacher", isEqualTo: result.uid).limit(4).snapshots();

      _AppBarOptions = <Widget>[
        AppBar(
          title: new Text('Dashboard', style: TextStyle(color: Colors.white)),
          backgroundColor: Colors.white,
        ),
        AppBar(
            title: new Text('Lessons', style: TextStyle(color: Colors.white))),
        AppBar(title: new Text('Tasks', style: TextStyle(color: Colors.white))),
        AppBar(
            title: new Text('Settings', style: TextStyle(color: Colors.white)))
      ];

      _widgetOptions = <Widget>[
        Text(
          'Dashboard will go here',
          style: optionStyle,
        ),
        StreamBuilder(
            stream: stream,
            builder: (context, snapshot) {
              if(snapshot.hasData) {
                return ListView.builder(
                  itemExtent: 80.0,
                  itemCount: snapshot.data.documents.length,
                  itemBuilder: (context, index) =>
                      _buildListItem(context, snapshot.data.documents[index]),
                );
              } else {
                return Text('You have no Lessons');
              }

            }),
        Text(
          'Tasks will go here',
          style: optionStyle,
        ),
        Container(
          child: new RaisedButton(
            child: new Text('Sign Out'),
            onPressed: signOut,
          ),
        )
      ];
    });
  }

我面临的问题是build方法是在此方法完成之前执行的,该方法使用widgetOptions显示文本,从而导致错误。

我想知道是否有什么方法可以改善此功能,以便能够获取用户ID并在stream中使用它,以便它可以提取文档?

非常感谢。

2 个答案:

答案 0 :(得分:3)

在这种情况下,Flutter拥有FutureBuilder小部件。

将提供的Future完成后的那一刻“推迟” UI块的构建。

阅读此类的API文档,查看一些示例,您将解决问题。

因此,您将卸载initState方法的一部分,在其中构造builder的{​​{1}}参数的选项列表。

答案 1 :(得分:0)

为缓解此问题,可以使用布尔值和setState()来更改其值。拥有用户ID后,如果布尔值为true,则可以构建需要用户ID的小部件,否则可以使该小部件成为进度指示器或只是“加载”文本。