0

I'm working on a chat room and I want to enable users send photos in chat. But I don't seem to be getting a hang of it.

I have the image picker widget, but I'm still yet to implement it cos I can't get a hang of it.

Here is the code to the chat screen and a photo as well. I have initialised Firebase properly and everything is working fine, messages are sending, and all. But I want to implement a message send feature into the project.

import 'package:chat/constants.dart';
import 'package:chat/utilities/constants.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:chat/models/auth.dart';
import 'package:chat/models/message.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class ChatScreen extends StatefulWidget {
  final AuthImplementation auth;
  final VoidCallback signedOut;

  ChatScreen({
    this.auth,
    this.signedOut,
  });

  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final Firestore _firestore = Firestore.instance;

  TextEditingController messageController = TextEditingController();
  ScrollController scrollController = ScrollController();

  String userName;
  @override
  void initState() {
    super.initState();
    widget.auth.getCurrentUserEmail().then((email) {
      setState(() {
        final String userEmail = email;
        final endIndex = userEmail.indexOf("@");
        userName = userEmail.substring(0, endIndex);
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: new Container(
          padding: new EdgeInsets.all(8.0),
          decoration: new BoxDecoration(
            image: new DecorationImage(
                image: new AssetImage("assets/images/social-logo.png"),
                fit: BoxFit.fill),
            color: Colors.white,
            borderRadius: new BorderRadius.all(new Radius.circular(80.0)),
            border: new Border.all(
              color: Colors.white,
              width: 1.0,
            ),
          ),
        ),
        title: Text("One Gov FX Signal Room",
            style: TextStyle(
              fontSize: 20,
              color: Colors.white,
              fontWeight: FontWeight.bold,
              fontFamily: 'Spartan',
            )),
        backgroundColor: kPrimaryColor,
        actions: <Widget>[
          IconButton(
              icon: FaIcon(FontAwesomeIcons.signOutAlt),
              color: Colors.white,
              onPressed: logOut),
        ],
      ),
      backgroundColor: antiFlashWhite,
      body: Column(
        children: <Widget>[
          Container(
            color: Colors.white,
            padding: EdgeInsets.only(left: 10, right: 0, bottom: 10, top: 10),
            child: Row(
              children: [
                CircleAvatar(
                  backgroundColor: Colors.white,
                  backgroundImage: AssetImage("assets/images/social-logo.png"),
                ),
                SizedBox(
                  width: 50,
                ),
                Flexible(
                  child: Column(children: const <Widget>[
                    Text('Message From the Admins'),
                    Text(
                        'Keep your messages polite and do not abuse the channel. Try to keep your discussions within the community guidelines'),
                  ]),
                )
              ],
            ),
          ),
          Expanded(
            child: Container(
              //margin: EdgeInsets.symmetric(horizontal: 5),
              child: StreamBuilder<QuerySnapshot>(
                  stream: _firestore
                      .collection("messages")
                      .orderBy(
                        "timestamp",
                      )
                      .snapshots(),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      return Center(
                        child: CircularProgressIndicator(
                          backgroundColor: kPrimaryColor,
                        ),
                      );
                    List<DocumentSnapshot> docs = snapshot.data.documents;

                    List<Widget> messages = docs
                        .map((doc) => Message(
                              user: doc.data['user'],
                              text: doc.data['text'],
                              timestamp: doc.data['timestamp'],
                              mine: userName == doc.data['user'],
                            ))
                        .toList();
                    return ListView(
                      controller: scrollController,
                      children: messages,
                    );
                  }),
            ),
          ),
          Container(
            color: Colors.white,
            child: Row(
              children: <Widget>[
                IconButton(
                  icon: FaIcon(
                    FontAwesomeIcons.image,
                    color: kPrimaryColor,
                  ),
                  onPressed: sendChat,
                ),
                Expanded(
                  child: Padding(
                    padding: const EdgeInsets.all(10),
                    child: TextField(
                      style: TextStyle(
                        fontFamily: 'Poppins',
                        fontSize: 15,
                      ),
                      onSubmitted: (value) => sendChat(),
                      controller: messageController,
                      keyboardType: TextInputType.multiline,
                      textInputAction: TextInputAction.newline,
                      maxLines: null,
                      cursorColor: kPrimaryColor,
                      decoration: InputDecoration(
                        border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20)),
                        filled: true,
                        hintText: "Say Something. Be Nice...",
                        hintStyle:
                            TextStyle(fontFamily: 'Montserrat', fontSize: 12),
                      ),
                    ),
                  ),
                ),
                IconButton(
                  icon: FaIcon(
                    FontAwesomeIcons.paperPlane,
                    color: kPrimaryColor,
                  ),
                  onPressed: sendChat,
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  void logOut() async {
    try {
      await widget.auth.signOut();
      widget.signedOut();
    } catch (e) {
      print("error :" + e.toString());
    }
  }

  Future<void> sendChat() async {
    if (messageController.text.length > 0) {
      await _firestore.collection("messages").add({
        'user': userName,
        'text': messageController.text,
        'timestamp': FieldValue.serverTimestamp(),
      });
      messageController.clear();
      scrollController.animateTo(scrollController.position.maxScrollExtent,
          duration: Duration(milliseconds: 300), curve: Curves.easeOut);
    }
  }
}

Screenshot of the chat screen:

Screenshot of the chat screen

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Edgar1102
  • 81
  • 1
  • 2
  • 5
  • You can use firebase storage to save image and store the unique name of image in firestore chat collection then you can load the image from plugin like firebase_image – Sachin Bhankhar Jun 06 '21 at 20:58

1 Answers1

0

To send images in a chat, you need a place to host those images. One way of doing this is by using file hosting services like Firebase Cloud Storage. This boils down to these steps.

  • Upload images on Cloud Storage. The image paths from the device's local storage can be fetched using image_picker

  • Store the Cloud Storage path of the uploaded image i.e. using Cloud Firestore

  • Display the image from the Cloud Storage path using Image.network()

Omatt
  • 8,564
  • 2
  • 42
  • 144