Flutter SteamBuilder snapshot.data 为空
Flutter SteamBuilder snapshot.data is null
我是 Flutter 新手。我正在尝试使用 SteamBuilder 检索快照数据。
但是 snapshot.data 返回 null。
snapshot.connectionState == ConnectionState.done
是假的。
snapshot.hasData
是假的。
这是我试图在其中检索快照数据的 dart 文件
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).userData,
builder: (context, snapshot) {
//print(snapshot.connectionState == ConnectionState.done);
//print(snapshot.data);
if(snapshot.hasData){
print('snapshot has data');
UserData userData = snapshot.data;
return Form(
key: _formKey,
child: Column(
children: <Widget>[
Text(
'Update your brew settings.',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 20.0),
TextFormField(
initialValue: userData.name,
decoration: textInputDecorator,
validator: (val) => val.isEmpty ? 'Please enter a name' : null,
onChanged: (val) => setState(() => _currentName = val),
),
SizedBox(height: 10.0),
DropdownButtonFormField(
value: _currentSugars ?? userData.sugars,
decoration: textInputDecorator,
items: sugars.map((sugar) {
return DropdownMenuItem(
value: sugar,
child: Text('$sugar sugars'),
);
}).toList(),
onChanged: (val) => setState(() => _currentSugars = val ),
),
SizedBox(height: 10.0),
Slider(
value: _currentStrength.toDouble() ?? userData.strength,
activeColor: Colors.brown[_currentStrength ?? userData.strength],
inactiveColor: Colors.brown[_currentStrength ?? userData.strength],
min: 100.0,
max: 900.0,
divisions: 8,
onChanged: (val) => setState(() => _currentStrength = val.round()),
),
RaisedButton(
color: Colors.pink[400],
child: Text(
'Update',
style: TextStyle(color: Colors.white),
),
onPressed: () async {
print(_currentName);
print(_currentSugars);
print(_currentStrength);
}
),
],
),
);
} else {
print('snapshot doesnt have data');
return Loading();
}
}
);
这是流
Stream<UserData> get userData {
return brewCollection.document(uid).snapshots().map(_userDataFromSnapshot);
}
brewCollection-
final CollectionReference brewCollection = Firestore.instance.collection('brews');
_userDataFromSnapshot
UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: uid,
name: snapshot.data['name'],
sugars: snapshot.data['sugars'],
strength: snapshot.data['strength']
);
}
用户数据
class UserData {
final String uid;
final String name;
final String strength;
final int sugars;
UserData({ this.uid, this.sugars, this.strength, this.name });
}
由于我是 Flutter 的新手,所以我不知道如何解决这个问题。
请帮帮我。谢谢。
一般需要检查3种情况:
- 快照为空(在触发任何流或动作之前,通常是正确的
创建小部件时)
- 快照不为空且数据为 null/invalid(流已注册但尚未发出数据)
- 快照不为空且数据有效(已接收数据)
此处您没有处理错误,因此很难仅通过查看代码就知道发生了什么,因此也可以在快照上捕获错误,如
if(snapshot.hasData){
//Show widget with data
}else if(snapshot.hasError){
return Center(
child:Text(snapshot.error.toString());
);
}else{
return CircularProgressIndicator();
}
UserData class 应该是
class UserData {
final String uid;
final String name;
final int strength; // type int not String
final String sugars; // type String not int
UserData({ this.uid, this.sugars, this.strength, this.name });
}
我对强度和糖分的数据类型感到困惑。我的错。
这是一个愚蠢的错误。
感谢您的回复:)
我是 Flutter 新手。我正在尝试使用 SteamBuilder 检索快照数据。 但是 snapshot.data 返回 null。 snapshot.connectionState == ConnectionState.done 是假的。 snapshot.hasData 是假的。
这是我试图在其中检索快照数据的 dart 文件
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).userData,
builder: (context, snapshot) {
//print(snapshot.connectionState == ConnectionState.done);
//print(snapshot.data);
if(snapshot.hasData){
print('snapshot has data');
UserData userData = snapshot.data;
return Form(
key: _formKey,
child: Column(
children: <Widget>[
Text(
'Update your brew settings.',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 20.0),
TextFormField(
initialValue: userData.name,
decoration: textInputDecorator,
validator: (val) => val.isEmpty ? 'Please enter a name' : null,
onChanged: (val) => setState(() => _currentName = val),
),
SizedBox(height: 10.0),
DropdownButtonFormField(
value: _currentSugars ?? userData.sugars,
decoration: textInputDecorator,
items: sugars.map((sugar) {
return DropdownMenuItem(
value: sugar,
child: Text('$sugar sugars'),
);
}).toList(),
onChanged: (val) => setState(() => _currentSugars = val ),
),
SizedBox(height: 10.0),
Slider(
value: _currentStrength.toDouble() ?? userData.strength,
activeColor: Colors.brown[_currentStrength ?? userData.strength],
inactiveColor: Colors.brown[_currentStrength ?? userData.strength],
min: 100.0,
max: 900.0,
divisions: 8,
onChanged: (val) => setState(() => _currentStrength = val.round()),
),
RaisedButton(
color: Colors.pink[400],
child: Text(
'Update',
style: TextStyle(color: Colors.white),
),
onPressed: () async {
print(_currentName);
print(_currentSugars);
print(_currentStrength);
}
),
],
),
);
} else {
print('snapshot doesnt have data');
return Loading();
}
}
);
这是流
Stream<UserData> get userData {
return brewCollection.document(uid).snapshots().map(_userDataFromSnapshot);
}
brewCollection-
final CollectionReference brewCollection = Firestore.instance.collection('brews');
_userDataFromSnapshot
UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: uid,
name: snapshot.data['name'],
sugars: snapshot.data['sugars'],
strength: snapshot.data['strength']
);
}
用户数据
class UserData {
final String uid;
final String name;
final String strength;
final int sugars;
UserData({ this.uid, this.sugars, this.strength, this.name });
}
由于我是 Flutter 的新手,所以我不知道如何解决这个问题。 请帮帮我。谢谢。
一般需要检查3种情况:
- 快照为空(在触发任何流或动作之前,通常是正确的 创建小部件时)
- 快照不为空且数据为 null/invalid(流已注册但尚未发出数据)
- 快照不为空且数据有效(已接收数据)
此处您没有处理错误,因此很难仅通过查看代码就知道发生了什么,因此也可以在快照上捕获错误,如
if(snapshot.hasData){
//Show widget with data
}else if(snapshot.hasError){
return Center(
child:Text(snapshot.error.toString());
);
}else{
return CircularProgressIndicator();
}
UserData class 应该是
class UserData {
final String uid;
final String name;
final int strength; // type int not String
final String sugars; // type String not int
UserData({ this.uid, this.sugars, this.strength, this.name });
}
我对强度和糖分的数据类型感到困惑。我的错。 这是一个愚蠢的错误。
感谢您的回复:)