从昨晚到今天我一直在寻找这个问题的解决方案。我遇到了这个问题的许多不同变体,但似乎没有一个解决方案适合我的我的。
我知道接收器返回为空,但我不明白为什么。当我在Firebase中查找时,我可以看到我尝试检索的帖子,它有一个有效的postId和一个网址。所以我不明白我错过了什么。
有人可以帮我解决这个问题吗?如果还有其他有用的信息,请告诉我。
这是我收到的错误消息:
The following NoSuchMethodError was thrown building FutureBuilder<DocumentSnapshot>(dirty, state: _FutureBuilderState<DocumentSnapshot>#08c05):
PostScreenPage.dart
import 'package:buddiesgram/pages/HomePage.dart';
import 'package:buddiesgram/widgets/PostWidget.dart';
import 'package:buddiesgram/widgets/ProgressWidget.dart';
import 'package:flutter/material.dart';
class PostScreenPage extends StatelessWidget {
final String userId;
final String postId;
//List<Post> posts = [];
PostScreenPage({
this.userId,
this.postId,
});
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: postsReference.document(userId).collection("usersPost").document(postId).get(),
builder: (BuildContext context, AsyncSnapshot dataSnapshot){
if(!dataSnapshot.hasData) {
return circularProgress();
}
Post post = Post.fromDocument(dataSnapshot.data);
return Center(
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
leading: IconButton(icon: Icon(Icons.arrow_back, color: Colors.blue,), onPressed: () => Navigator.pop(context),),
title: Text("Posts", style: TextStyle(fontSize: 24.0, color: Colors.blue, fontWeight: FontWeight.bold),),
),
body: ListView(
children: <Widget>[
Container(
child: post,
),
],
),
),
);
},
);
}
}
该错误还指向错误消息中的 postId 行
PostWidget.dart
factory Post.fromDocument(DocumentSnapshot documentSnapshot) {
return Post(
postId: documentSnapshot["postId"],
ownerId: documentSnapshot["ownerId"],
likes: documentSnapshot["likes"],
username: documentSnapshot["username"],
description: documentSnapshot["description"],
location: documentSnapshot["location"],
url: documentSnapshot["url"],
);
}
问题是你把DocumentSnapshot
当成Map
。[]
不是DocumentSnapshot
的有效表示法。要解决此问题,请执行以下操作:
factory Post.fromDocument(DocumentSnapshot documentSnapshot) {
Map<String, dynamic> mapOfData = documentSnapshot.data;
return Post(
postId: mapOfData["postId"],
ownerId: mapOfData["ownerId"],
likes: mapOfData["likes"],
username: mapOfData["username"],
description: mapOfData["description"],
location: mapOfData["location"],
url: mapOfData["url"],
);
}
此代码在尝试访问其字段之前,使用.data
getter 从DocumentSnapshot
中检索Map
数据。
所以在浪费了这么多时间之后,我发现这完全是我的错。一个愚蠢的拼写错误。我把"usersPost"而不是"usersPosts"放进去。我错过了那个s。摩尔的解决方案也@Christopher也有效。我尝试了他的工厂解决方案和我的旧工厂解决方案,它们都有效。因此,如果您碰巧遇到此问题,请先进行拼写检查,然后尝试他的解决方案。感谢大家的帮助!