简体   繁体   English

错误:正文可能正常完成,导致返回“null”,但返回类型是不可为空的类型

[英]error: The body might complete normally, causing 'null' to be returned, but the return type is a non-nullable type

I am building a flashChat app using FireBase.It is basically a chat app that can be used to send messages.And the messages are stored inside the FireBase collection.We have to retrieve and display the messages on the screen.我正在使用 FireBase 构建一个 flashChat 应用程序。它基本上是一个可用于发送消息的聊天应用程序。消息存储在 FireBase 集合中。我们必须检索消息并将其显示在屏幕上。

To display the contents(snapshots) I am using Streams.要显示内容(快照),我正在使用 Streams。 I am getting the following error我收到以下错误

error: The body might complete normally, causing 'null' to be returned, but the return type is a potentially non-nullable type.错误:正文可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型。 (body_might_complete_normally at [flashchat1] lib\screens\chat_screen.dart:80) (body_might_complete_normally 在 [flashchat1] lib\screens\chat_screen.dart:80)

Here is my Code:-这是我的代码:-

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flashchat1/constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class ChatScreen extends StatefulWidget {
  static String id='Chat_Screen';
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final _fireStore = FirebaseFirestore.instance;//an instance of fireBase store that stored data created
  final _auth = FirebaseAuth.instance;//instance/object of fireBase auth that authorizes users is created
  late User loggedInUser;//LoggedInUser is of type FireBase user(now changed to user)
  late String messageText;
  @override
  void initState()
  {
    super.initState();
    getCurrentUser();//calling the getCurrentUser
  }
  void getCurrentUser()
  async{
    try
    {
      final user= await _auth.currentUser;//get the current user id/name.Also currentUser return a future so make it async by adding await and async keywords
      if(user!=null)
      {
        loggedInUser=user ;//LoggedInUser = user contains email of the users
        print(loggedInUser.email);
      }

    }
    catch(e)
    {
      print(e);
    }
  }// Under collection there is documents.Inside documents there are fields like type ,values etc.These fields contain our information
    Future<void> messageStream()//Using a stream it becomes very easy .U just need to click once after you run the app .Then u will be done.
    async {//The snapShot here is FireBase's Query SnapShot
      await for(var snapshot in _fireStore.collection('messages').snapshots()){//make a variable snapshot to store the entire items of the collection in fireBase (Look at the fireBase console there is a collection called messages).This collection takes the snapshot of all the iteams (not literal snapshot .Think it like a snapShot)
        for(var message in snapshot.docs)//make a variable message to access the snapShot.docs .(docs stands for Documentation.Look at the fireBase console)
        print(message.data());
      }
    }
  void getMessages()//(The problem with this is that we need to keep clicking on the onPressed button every single time the new message is sent .So it is not convinient
  async {
    final messages = await _fireStore.collection('messages').get();//to retrieve the data from fire base we are creating a variable message
   messages.docs;//retreive the data from document section under the collection in firestore
    for(var message in messages.docs)//since it is a messages.docs is a list we need to loop through it
       {
        print(message.data());//print the data its messge.data()
     }
  }
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: null,
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                messageStream();
                //_auth.signOut();
                //Navigator.pop(context);
                //Implement logout functionality
              }),
        ],
        title: Text('⚡️Chat'),
        backgroundColor: Colors.lightBlueAccent,
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            StreamBuilder(
              stream:_fireStore.collection('messages').snapshots(),
              builder: (context, AsyncSnapshot snapshot) {//This is Flutter's Async snapShot
                if(snapshot.hasData){//flutters async snapshot contains a query snapshot
                  final messages = snapshot.data.docs;
                  List<Text> messageWidgets = [];
                  for(var  message in messages)//Loop through the messages
                    {
                      final messageText = message.data['text'];//retrieve the data under the text field in message collection
                      final messageSender = message.data['Sender'];//retrieve the data under the Sender field in message collection
                      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;//Whatever you chat will be stored in the variable String variable messageText
                      },
                      decoration: kMessageTextFieldDecoration,
                    ),
                  ),
                  FlatButton(
                    onPressed: () {
                      _fireStore.collection('messages').add({
                        'text': messageText,//add the messages sent to fireStore under the messages object that we created manually
                        'Sender': loggedInUser.email,//add the current users email to the sender field
                      },);
                    },//goal is to send the data that we type here to the fireStore cloud
                    child: Text(
                      'Send',
                      style: kSendButtonTextStyle,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
} 

You don't return anyting in your StreamBuilder when the if condition is not resolved...当 if 条件未解决时,您不会在 StreamBuilder 中返回任何内容...

Just add a else with, say... SizedBox.shrink() or whatever you need只需添加一个其他的,比如... SizedBox.shrink()或任何你需要的

Or return an empty Column或者返回一个空Column

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 正文可能会正常完成,导致返回“null”,但返回类型可能是不可为空的类型 - The body might complete normally, causing 'null' to be returned, but the return type, is a potentially non-nullable type 主体可能正常完成,导致返回“null”,但返回类型“Widget”可能是不可为 null 的类型。 Flutter码 - The body might complete normally, causing 'null' to be returned, but the return type, 'Widget', is a potentially non-nullable type. Flutter code 错误无法为不可空类型返回 null:父 MyModelType 中的“字符串”(/createMyModelType/id) - Error Cannot return null for non-nullable type: 'String' within parent MyModelType' (/createMyModelType/id) 错误:必须返回非空值,因为返回类型“从不”不允许 null - Error: A non-null value must be returned since the return type 'Never' doesn't allow null Flutter Firebase Auth 上的编译错误:“必须返回非空值,因为返回类型‘从不’不允许 null。” - Flutter Compile Error on Firebase Auth: "A non-null value must be returned since the return type 'Never' doesn't allow null." 必须返回非空值,因为返回类型“UserCredentialPlatform”不允许空值 - A non-null value must be returned since the return type 'UserCredentialPlatform' doesn't allow null 错误:必须返回非空值,因为返回类型“Never”不允许 null。Never convertPlatformException(对象异常,StackTrace - Error: A non-null value must be returned since the return type 'Never' doesn't allow null. Never convertPlatformException(Object exception, StackTrace 未处理的异常:PlatformException(空错误,主机平台为非空返回值返回 null 值。,null,空) - Unhandled Exception: PlatformException(null-error, Host platform returned null value for non-null return value., null, null) FirebaseCloudMessaging: PlatformException (PlatformException(null-error, Host platform returned null value for non-null return value., null, null)) - FirebaseCloudMessaging : PlatformException (PlatformException(null-error, Host platform returned null value for non-null return value., null, null)) 必须初始化不可为 null 的实例字段“arCoreController” - Non-nullable instance field 'arCoreController' must be initialized
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM