在我的Flutter课程中浏览课程,但无法运行以下代码
我试图从firestore获取项目,以在应用程序上的列表视图中显示,但获得“构建函数返回null。有问题的小部件是:streambuilder,构建函数必须切勿返回null”。我只想从ListView中显示的Firstore列表“帖子”。
构建函数返回的null。令人讨厌的小部件是StreamBuilder< querysnapshot>构建功能绝不能返回null。
请帮助我解决应用程序
import 'package:flutter/material.dart';
import 'package:flash_chat/constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class ChatScreen extends StatefulWidget {
static const String id = 'chat_screen';
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final _fireStore = FirebaseFirestore.instance;
final _auth = FirebaseAuth.instance;
User loggedInUser;
String messageText;
@override
void initState() {
super.initState();
getCurrentUser();
}
void getCurrentUser() async {
try {
final user = await _auth.currentUser;
if (user != null) {
loggedInUser = user;
print(loggedInUser.email);
}
} catch (e) {
print(e);
}
}
void messageStream() async {
await for (var snapShot in _fireStore.collection('messages').snapshots()) {
for (var message in snapShot.docs) {
print(message.data());
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: null,
actions: <Widget>[
IconButton(
icon: Icon(Icons.close),
onPressed: () {
messageStream();
// _auth.signOut();
// Navigator.pop(context);
}),
],
title: Text('⚡️Chat'),
backgroundColor: Colors.lightBlueAccent,
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: _fireStore.collection('messages').snapshots(),
builder: (context, snapshot){
if(snapshot.hasData){
final messages = snapshot.data.docs;
List<Text> messageWidgets = [];
for (var message in messages){
final messageText = (message.data as Map<String, dynamic>)['text'];
final messageSender = (message.data as Map<String, dynamic>)['sender'];
final messageWidget = Text('$messageText from $messageSender');
messageWidgets.add(messageWidget);
} return Column(
children: messageWidgets,
);
}
},),
Container(
decoration: kMessageContainerDecoration,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
child: TextField(
onChanged: (value) {
messageText = value;
},
decoration: kMessageTextFieldDecoration,
),
),
FlatButton(
onPressed: () {
_fireStore.collection('messages').add({
'text': messageText,
'sender': loggedInUser.email
});
},
child: Text(
'Send',
style: kSendButtonTextStyle,
),
),
],
),
),
],
),
),
);
}
}
Im trying to get items from firestore to be shown in Listview on the app but getting "build function returned null.The offending widget is: StreamBuilder,Build functions must never return null". I just want the list 'post' from firstore shown in listview.
a build function returned null. the offending widget is StreamBuilder<QuerySnapshot> Build function must never return null.
Please help me out on the issue with app
import 'package:flutter/material.dart';
import 'package:flash_chat/constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class ChatScreen extends StatefulWidget {
static const String id = 'chat_screen';
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final _fireStore = FirebaseFirestore.instance;
final _auth = FirebaseAuth.instance;
User loggedInUser;
String messageText;
@override
void initState() {
super.initState();
getCurrentUser();
}
void getCurrentUser() async {
try {
final user = await _auth.currentUser;
if (user != null) {
loggedInUser = user;
print(loggedInUser.email);
}
} catch (e) {
print(e);
}
}
void messageStream() async {
await for (var snapShot in _fireStore.collection('messages').snapshots()) {
for (var message in snapShot.docs) {
print(message.data());
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: null,
actions: <Widget>[
IconButton(
icon: Icon(Icons.close),
onPressed: () {
messageStream();
// _auth.signOut();
// Navigator.pop(context);
}),
],
title: Text('⚡️Chat'),
backgroundColor: Colors.lightBlueAccent,
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: _fireStore.collection('messages').snapshots(),
builder: (context, snapshot){
if(snapshot.hasData){
final messages = snapshot.data.docs;
List<Text> messageWidgets = [];
for (var message in messages){
final messageText = (message.data as Map<String, dynamic>)['text'];
final messageSender = (message.data as Map<String, dynamic>)['sender'];
final messageWidget = Text('$messageText from $messageSender');
messageWidgets.add(messageWidget);
} return Column(
children: messageWidgets,
);
}
},),
Container(
decoration: kMessageContainerDecoration,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
child: TextField(
onChanged: (value) {
messageText = value;
},
decoration: kMessageTextFieldDecoration,
),
),
FlatButton(
onPressed: () {
_fireStore.collection('messages').add({
'text': messageText,
'sender': loggedInUser.email
});
},
child: Text(
'Send',
style: kSendButtonTextStyle,
),
),
],
),
),
],
),
),
);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因此,您描述的问题是
streamBuilder
返回null
,即使widget
。然后,让我们专注于代码的那一部分。我清理了格式,以使其更容易理解。
Builder
函数将返回小部件。但是,如果语句,您的代码立即以开始,并且以下代码仅在
snapshot.hasdata
是正确时执行。因此,列
仅在这种情况下返回。当快照尚未完成时,IE具有 ,或者投掷 error 没有
else
/shartback部分,代码将简单返回而无需给出widget
返回呼叫者,返回null
。在这些情况下,可以通过提供回退回报来解决:
So the problem as you describe it is that
StreamBuilder
returnsnull
even though aWidget
is expected. Let's focus on that part of your code then.I cleaned up the formatting to make it easier to understand.
The
builder
function is what shall return a Widget. However, your code starts right off with anif
statement and the code below will only be executed whensnapshot.hasData
is true. Therefore, theColumn
is only returned in that case.When the snapshot has not yet finished, i.e. has no data, or threw an error there is no
else
/fallback section, the code will simply return without giving aWidget
back to the caller, returningnull
.This can be solved by providing fallback returns in these cases: