我正在使用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
中使用它,以便它可以提取文档?
非常感谢。
答案 0 :(得分:3)
在这种情况下,Flutter拥有FutureBuilder小部件。
将提供的Future
完成后的那一刻“推迟” UI块的构建。
阅读此类的API文档,查看一些示例,您将解决问题。
因此,您将卸载initState
方法的一部分,在其中构造builder
的{{1}}参数的选项列表。
答案 1 :(得分:0)
为缓解此问题,可以使用布尔值和setState()
来更改其值。拥有用户ID后,如果布尔值为true
,则可以构建需要用户ID的小部件,否则可以使该小部件成为进度指示器或只是“加载”文本。