Firebase ';未来<;QuerySnapshot>';不是类型为';溪流<;动态>';?
我正在努力尝试使用streambuider。我收到一个错误,上面写着:Firebase ';未来<;QuerySnapshot>';不是类型为';溪流<;动态>';?,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我正在努力尝试使用streambuider。我收到一个错误,上面写着: ════════ Exception caught by widgets library ═══════════════════════════════════ The following _TypeError was thrown building StreamBuilder<UserData>(dirty, state: _StreamBuilderBaseState<UserData, AsyncSn
════════ Exception caught by widgets library ═══════════════════════════════════
The following _TypeError was thrown building StreamBuilder<UserData>(dirty, state: _StreamBuilderBaseState<UserData, AsyncSnapshot<UserData>>#e2c02):
type 'Future<QuerySnapshot>' is not a subtype of type 'Stream<dynamic>' of 'function result'
════════ widgets库捕获到异常═══════════════════════════════════
生成StreamBuilder时引发了以下类型错误(脏,状态:_StreamBuilderBaseState#e2c02):
“Future”类型不是“function result”的“Stream”类型的子类型
这是我的密码
Stream myVideos;
getalldata() async {
//get videos as future
myVideos = FirebaseFirestore.instance
.collection('videos')
.where('uid', isEqualTo: widget.userid)
.snapshots();
var documents = await FirebaseFirestore.instance
.collection('videos')
.where('uid', isEqualTo: widget.userid)
.get();
if (documents.docs.isNotEmpty) {
for (var item in documents.docs) {
likes = item.data()['likes'].length + likes;
}
} else {
setState(() {
picturesdontexists = true;
});
}
setState(() {
dataisthere = true;
});
}
@override
Widget build(BuildContext context) {
final user = Provider.of<Userforid>(context);
return dataisthere == false
? Scaffold(body: Center(child: CircularProgressIndicator()))
: StreamBuilder<UserData>(
stream: DatbaseService(uid: user?.uid).userData,
builder: (context, snapshot) {
if (snapshot.hasData) {
UserData userData = snapshot.data;
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0.0,
- - - - - - - - - -
),
),
StreamBuilder(
stream: myVideos,
builder: ( context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if(videos>0){
print(snapshot.data);
return StaggeredGridView.countBuilder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
physics: ScrollPhysics(),
crossAxisCount: 3,
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
DocumentSnapshot video =
snapshot.data.docs[index];
return InkWell(
onTap: () {
Navigator.of(context)
.pushNamed(ChatFirstpage.route);
},
child: Card(
elevation: 0.0,
streammyvideos;
getalldata()异步{
//获取视频作为未来
myVideos=FirebaseFirestore.instance
.collection(“视频”)
.where('uid',isEqualTo:widget.userid)
.快照();
var documents=等待FirebaseFirestore.instance
.collection(“视频”)
.where('uid',isEqualTo:widget.userid)
.get();
if(documents.docs.isNotEmpty){
for(documents.docs中的var项){
likes=item.data()['likes'].length+likes;
}
}否则{
设置状态(){
picturesdontexists=真;
});
}
设置状态(){
dataisthere=true;
});
}
@凌驾
小部件构建(构建上下文){
最终用户=提供者(上下文);
返回dataisthere==false
?脚手架(主体:中心(子体:环形压路指示器()))
:StreamBuilder(
流:DatbaseService(uid:user?.uid).userData,
生成器:(上下文,快照){
if(snapshot.hasData){
UserData UserData=snapshot.data;
返回脚手架(
appBar:appBar(
背景颜色:颜色。透明,
标高:0.0,
- - - - - - - - - -
),
),
StreamBuilder(
流:我的视频,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(子项:CircularProgressIndicator());
}
如果(视频>0){
打印(快照数据);
返回EdgridView.countBuilder(
滚动方向:轴垂直,
收缩膜:对,
物理:物理(),
交叉轴计数:3,
itemCount:snapshot.data.docs.length,
itemBuilder:(上下文,索引){
文档快照视频=
snapshot.data.docs[索引];
回墨槽(
onTap:(){
导航器(上下文)
.pushNamed(ChatFirstpage.route);
},
孩子:卡片(
标高:0.0,
我认为错误是在流中抛出的,因为在我使用流myVideos之前,我没有收到任何错误,而且一切正常。
也许任何人都可以帮忙,谢谢!如果你需要更多信息,请留言
这是我的服务
class DatbaseService {
static DatbaseService instance = DatbaseService();
final String uid;
String _messages = "messages";
String _images = "images";
DatbaseService({this.uid});
//userData from snapshot
UserData userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: uid,
email: snapshot.data()['email'],
fullname: snapshot.data()['fullname'],
password: snapshot.data()['password'],
url: snapshot.data()['url'],
username: snapshot.data()['username'],
);
}
//get user doc stream
Stream<UserData> get userData {
return myprofilsettings.doc(uid).snapshots().map(userDataFromSnapshot);
}
``
class-DatbaseService{
静态DatbaseService实例=DatbaseService();
最后一个字符串uid;
字符串_messages=“messages”;
字符串_images=“images”;
DatbaseService({this.uid});
//来自快照的用户数据
UserData userDataFromSnapshot(DocumentSnapshot快照){
返回用户数据(
uid:uid,
电子邮件:snapshot.data()['email'],
全名:snapshot.data()['fullname'],
密码:snapshot.data()['password'],
url:snapshot.data()['url'],
用户名:snapshot.data()['username'],
);
}
//获取用户文档流
流获取用户数据{
返回myprofilsettings.doc(uid).snapshots().map(userdatafromsapshot);
}
``
当您传递一个未来时,通常会出现这种情况,其中流应该已经过去了,或者您已经将变量的类型定义为流,但您将该变量设置为一个未来值
我认为,您可以直接将
FirebaseFirestore.instance
.collection('videos')
.where('uid', isEqualTo: widget.userid)
.snapshots()
在流生成器内部
另外,请提供完整的代码(DatbaseService)。显示您的流DatbaseService我更新我的代码请检查以便您可以看到DatbaseService。我更新我的代码请检查以便您可以看到DatbaseService。