Incorrect use of parent Widget

Issue

I am trying to make a flash Chat App that retrieves the chats from fireBase and displays it on the Screen .I have wrapped it under an Expanded widget .I have give some padding to it .
I am getting the following error

The following assertion was thrown while looking for parent data.:
Incorrect use of ParentDataWidget.

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/email.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 info
        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>[
            Expanded(
              child: StreamBuilder(
                stream:_fireStore.collection('messages').snapshots(),
                builder: (context, AsyncSnapshot snapshot) {
                  //This is Flutter's Async snapShot
                  //if(!snapshot.data)
                   // {
                     // return Center(
                      //child:  CircularProgressIndicator(
                        //backgroundColor:Colors.lightBlueAccent,
                      //),
                      //);
                    //}
                  if(!snapshot.hasData){//flutters async snapshot contains a query snapshot
                    return Center(
                    child:CircularProgressIndicator(
                    backgroundColor:Colors.lightBlueAccent,
                ),
                      );
                    }
                    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',
                        style:TextStyle(
                          fontSize:50,
                        ),
                        );
                        messageWidgets.add(messageWidget);//add the text to the List messageWidget
                        }
                        return Expanded(
                          flex:2,
                          child: ListView(//changed from Column to ListView as we want to scroll down .Or else only finite messages can be fit
                            children: messageWidgets, //if u don't write else with a return it will show an error as null returned and null safety broken
                            padding: EdgeInsets.symmetric(horizontal: 5,vertical: 5),
                          ),
                        );
                  },
              ),
            ),
            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,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Solution

 return Expanded(
                      flex:2,
                      child: ListView(//changed from Column to ListView as we want to scroll down .Or else only finite messages can be fit
                        children: messageWidgets, //if u don't write else with a return it will show an error as null returned and null safety broken
                        padding: EdgeInsets.symmetric(horizontal: 5,vertical: 5),
                      ),
                    );

This code block is the issue here. You cannot use Expanded widget anywhere you like. The Expanded widget can only be used inside Row or Column Widget.

Remove the Expanded widget in the above code block. It will works.

Answered By – Prajeet Naga

Answer Checked By – Cary Denson (FlutterFixes Admin)

Leave a Reply

Your email address will not be published.