streambuilder此处存在一些问题..它似乎工作得很好,并根据需要返回用户名,但调试控制台中始终显示错误。
═══════小部件库捕获到异常═══════════════════════════════════ 方法'[]'在null上被调用。 接收者:null 尝试致电: 相关的引起错误的小部件是 StreamBuilder
class UpdateForm extends StatefulWidget {
@override
_UpdateFormState createState() => _UpdateFormState();
}
class _UpdateFormState extends State<UpdateForm> {
final _formKey = GlobalKey<FormState>();
// form values
String _currentName;
@override
Widget build(BuildContext context) {
User user = Provider.of<User>(context);
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).userData,
builder: (context, snapshot) {
if(snapshot.hasData){
UserData userData = snapshot.data;
return Form(
key: _formKey,
child: Column(
children: <Widget>[
Text(
'Update your settings.',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 20.0),
StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('users')
.document(user.uid)
.snapshots(),
builder: (BuildContext context,
AsyncSnapshot<DocumentSnapshot> snapshot) {
_currentName = snapshot.data['name'];
return Text(snapshot.data['name']);
}),
答案 0 :(得分:1)
这只是我如何使用StreamBuilder
的一个示例,请确保您同时在StreamBuilders
上使用此设置。另外,您已经嵌套了StreamBuilder
,但是AsyncSnapshots
的命名方式相同,请给它们起不同的名称,例如snapshot
和asyncSnapshot
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('Test').snapshots(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> asyncSnapshot) {
if (asyncSnapshot.hasData) {
List<DocumentChange> snapshot =
asyncSnapshot.data.documentChanges;
snapshot.forEach((DocumentChange change) {
_test.add(
Test(
name: change.document.data['name'],
value: change.document.data['value'],
),
);
});
return ListView.builder(
itemCount: _test.length,
itemBuilder: (BuildContext context, int index) {
return Row(
children: <Widget>[
Text(_test[index].name),
Text(_test[index].value.toString())
],
);
});
} else if (asyncSnapshot.hasError) {
return Text('There was an error...');
} else {
return CircularProgressIndicator();
}
},
),
答案 1 :(得分:1)
问题出在第二个流生成器中。您不检查流中是否有数据。因此,您的流第一次是空的,这会导致错误,并且一旦数据从流中出来,StreamBuilder
就会重新呈现自身,以隐藏第一次出现的错误。您正在检查第一个hasData
的{{1}}。
简单地检查流中是否有数据,如果暂时没有返回加载器。
StreamBuilder