【发布时间】:2026-01-08 19:35:01
【问题描述】:
我在使用这个未来的构建器时遇到了问题,似乎无法找到解决方案。我正在尝试创建一个映射到我创建的自定义类(“BlogPosts”)的文档列表(“帖子”),但是在尝试使用它时出现以下错误。
错误:
LateInitializationError: Field 'posts' has not been initialized.
堆栈跟踪告诉我错误正在生成器内部发生,但我已经在未来初始化了“帖子”
未来的建设者:
late User user;
late Userdata userdata;
CollectionReference usersRef = FirebaseFirestore.instance.collection('users');
CollectionReference postsRef = FirebaseFirestore.instance.collection('posts');
late List<BlogPost> posts;
FutureBuilder(
future: Future.wait([
usersRef.doc(user.uid).get().then((doc) {
userdata = Userdata.fromDocument(doc);
}),
postsRef.get().then((val) {
posts = val.docs.map((doc) => BlogPost.fromDocument(doc)).toList();
})
]),
builder: (context, snap) {
print(posts);
if(snap.connectionState == ConnectionState.done) {
return ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: 3,
itemBuilder: (context, index) {
return Text(userdata.displayName);
}
);
} else {
return Center(
child: Text('Loading')
);
}
}
)
完整代码:
late User user;
late Userdata userdata;
CollectionReference usersRef = FirebaseFirestore.instance.collection('users');
CollectionReference postsRef = FirebaseFirestore.instance.collection('posts');
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final auth = FirebaseAuth.instance;
late List<BlogPost> posts;
@override
Widget build(BuildContext context) {
user = auth.currentUser!;
Color getColor(Set<MaterialState> states) {
const Set<MaterialState> interactiveStates = <MaterialState>{
MaterialState.pressed,
MaterialState.hovered,
MaterialState.focused,
};
if (states.any(interactiveStates.contains)) {
return Colors.blue.shade900;
}
return Colors.blue.shade600;
}
return Scaffold(
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.blue,
child: Icon(
Icons.add,
color: Colors.white,
),
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (_) => Upload()));
},
),
appBar: AppBar(
backgroundColor: Colors.grey[600],
actions: [
TextButton(
child: Text(
'Logout',
style: TextStyle(color: Colors.black),
),
onPressed: () {
auth.signOut();
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => LoginScreen()));
},
style: ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith(getColor)
),
),
],
),
// body: Center(
// child: Text(user.uid)
// ),
body: FutureBuilder(
future: Future.wait([
usersRef.doc(user.uid).get().then((doc) {
userdata = Userdata.fromDocument(doc);
}),
postsRef.get().then((val) {
posts = val.docs.map((doc) => BlogPost.fromDocument(doc)).toList();
})
]),
builder: (context, snap) {
print(posts);
if(snap.connectionState == ConnectionState.done) {
return ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: 3,
itemBuilder: (context, index) {
return Text(userdata.displayName);
}
);
} else {
return Center(
child: Text('Loading')
);
}
}
)
);
}
}
class Userdata {
final String uid;
final String email;
final String displayName;
Userdata(this.uid, this.email, this.displayName);
factory Userdata.fromDocument(DocumentSnapshot doc) {
return Userdata(
doc['uid'],
doc['email'],
doc['displayName']
);
}
}
class BlogPost {
String displayName;
String postmsg;
String postId;
String UserId;
BlogPost(this.displayName, this.postmsg, this.postId, this.UserId);
factory BlogPost.fromDocument(DocumentSnapshot doc) {
return BlogPost(
doc['displayName'],
doc['postmsg'],
doc['postId'],
doc['UserId']
);
}
【问题讨论】:
标签: firebase flutter flutter-futurebuilder