在我的Flutter课程中浏览课程,但无法运行以下代码

发布于 2025-02-14 00:41:16 字数 3891 浏览 1 评论 0原文

我试图从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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱殇璃 2025-02-21 00:41:16

因此,您描述的问题是streamBuilder返回null,即使widget。然后,让我们专注于代码的那一部分。
我清理了格式,以使其更容易理解。

StreamBuilder<QuerySnapshot>(
  stream: _fireStore.collection('messages').
  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,
      );
    }
  },
),

Builder函数将返回小部件。但是,如果语句,您的代码立即以开始,并且以下代码仅在snapshot.hasdata是正确时执行。因此,仅在这种情况下返回。

当快照尚未完成时,IE具有 ,或者投掷 error 没有else/shartback部分,代码将简单返回而无需给出widget返回呼叫者,返回null
在这些情况下,可以通过提供回退回报来解决:

StreamBuilder<QuerySnapshot>(
  ...
  builder: (context, snashot) {
    if (snapshot.hasData) {
      ...
      return Column(...);
    }
    if (snapshot.hasError) {
      return Container(
        child: Text("An error occured..."),
       );
    }
    return Container(
      child: Text("No data received yet...Loading..."),
    );
  }
);

So the problem as you describe it is that StreamBuilder returns null even though a Widget is expected. Let's focus on that part of your code then.
I cleaned up the formatting to make it easier to understand.

StreamBuilder<QuerySnapshot>(
  stream: _fireStore.collection('messages').
  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,
      );
    }
  },
),

The builder function is what shall return a Widget. However, your code starts right off with an if statement and the code below will only be executed when snapshot.hasData is true. Therefore, the Column 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 a Widget back to the caller, returning null.
This can be solved by providing fallback returns in these cases:

StreamBuilder<QuerySnapshot>(
  ...
  builder: (context, snashot) {
    if (snapshot.hasData) {
      ...
      return Column(...);
    }
    if (snapshot.hasError) {
      return Container(
        child: Text("An error occured..."),
       );
    }
    return Container(
      child: Text("No data received yet...Loading..."),
    );
  }
);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文