在我的搜索中,有一些方法可以做到这一点。一种方法是同时使用FutureBuilder
和StreamBuilder
。但是我想在FutureBuilder中避免使用这个嵌套的StreamBuilder?
我试图创建一个方法,并从流构建器调用它。
_getData() async{
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String uid = user.uid.toString();
var snapshots =
Firestore.instance.collection('userinfo').document(uid).snapshots();
return snapshots;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text('Retrieve Text Input'),
),
body: new Container(
padding: EdgeInsets.only(top: 20.0, left: 10.0, right: 10.0),
child: new StreamBuilder(
stream: _getData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
var userDocument = snapshot.data;
return new Column(
children: <Widget>[
TextFormField(
initialValue: userDocument["name"].toString(),
//controller: _AdContr,
decoration: new InputDecoration(
labelText: 'Name',
fillColor: Colors.white,
border: new OutlineInputBorder(
borderRadius: new BorderRadius.circular(25.0),
borderSide: new BorderSide(),
),
//fillColor: Colors.green
),
),
SizedBox(height: 20),
TextFormField(
//initialValue: Text(userDocument["Surname"]).toString(),
//controller: _AdContr,
decoration: new InputDecoration(
labelText: 'Surname',
fillColor: Colors.white,
border: new OutlineInputBorder(
borderRadius: new BorderRadius.circular(25.0),
borderSide: new BorderSide(),
),
//fillColor: Colors.green
),
)
],
);
}
}),
),
);
}
但是我收到了这个错误:
类型'Future'不是'Stream'类型的子类型
我该如何解决这个问题?
你需要在StreamBuilder
中嵌入一个FutureBuilder
,因为你需要等待来自FirebaseAuth的用户才能获得流。但是,这一点都不差。
这就是Flutter的工作原理:嵌套小部件。
..., child: FutureBuilder(
future: FirebaseAuth.instance.currentUser(),
builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState != ConnectionState.done) return Container();
return StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance.collection('userinfo').document(snapshot.data.uid).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) return Container();
return Column(...);
},
);
})
另一个对此工作至关重要的方面是您始终从任何构建器返回窗口小部件。如果您没有将窗口小部件返回到Flutter中的构建器,则您的应用程序将中断,即将引发运行时异常。