Giter Site home page Giter Site logo

nstosic / toptal-flutter-chat Goto Github PK

View Code? Open in Web Editor NEW
51.0 5.0 22.0 134 KB

This is the source-code reference for the Toptal Engineering Blog article on using Flutter and Firebase to develop cross-platform instant messaging application.

Kotlin 0.21% Ruby 2.55% Swift 0.70% Objective-C 0.06% Dart 96.47%
flutter firebase

toptal-flutter-chat's Introduction

Codemagic build status

Toptal Flutter Chat

Cross-platform demo chat client developed using Flutter & Firebase for Toptal Engineering Blog article.

Build environment

This project is developed to work with flutter channel stable. There is no guarantee that it will work on different flutter channels.

API keys

Note - if you clone this repository and try running the project, it'll fail because I've removed API keys for Facebook and Firebase. Refer to the Facebook or Firebase official documentation for a step-by-step guide to setting up the project.

V2 refactor

As there's an ongoing process of refactoring FlutterFire libraries to offer better multi-platform support, this repo has also been through refactoring to support the latest version of Firebase libraries and iOS 14.

The current state of the master:

  • iOS 14 support
  • firebase_auth updated
  • cloud_firestore updated
  • firebase_messaging updated
  • firebase_storage

toptal-flutter-chat's People

Contributors

nitronbg avatar nstosic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

toptal-flutter-chat's Issues

Last message and time

Can you please add the feature or give some idea about how to show last message and sort list with the recent message and last message time on the screen which is showing the list of all chat rooms.

I am in the mid of project delivery it will be great for me and other developers who are willing to have this in their apps.

Breaking changes in flutter_bloc and FB login dependencies

Recent dependency updates have broken the sample:

  • flutter_bloc has deprecated dispatch in 1.0.0
  • In flutter_facebook_login 3.0.0, loginWithReadPermission renamed to login

My solution in the short term is:

  • pin flutter_bloc to 0.16.0 (later versions also contain breaking changes) in pubspec.yaml
  • update call to logInWithReadPermission() with logIn() in login_bloc.dart

I am submitting a PR for this fix, but creating an issue as it may be better to update the code for the flutter_bloc method change rather than pin the plugin version.

Compile errors with current repo code

Has the code changed. I get a lot of compile error. Here are few errors.

  1. error: 'CreateChatroomBloc.close' ('void Function()') isn't a valid override of 'Bloc.close' ('Future Function()'). (invalid_override at [toptal_chat] lib\create_chatroom\create_chatroom_bloc.dart:60)
  2. error: The named parameter 'builder' isn't defined. (undefined_named_parameter at [toptal_chat] lib\create_chatroom\create_chatroom_view.dart:24)
  3. error: The named parameter 'timestampsInSnapshotsEnabled' isn't defined. (undefined_named_parameter at [toptal_chat] lib\model\firebase_repo.dart:12)

PS: I fixed the rxdart issue by adding it to pubspec.

Message seen status

It would be better to add callback if the reciever has viewed the message just like the double tick on WhatsApp

Image not getting posted or shown in the Chat

Image not getting posted or shown in the Chat

it shows following error

The following _Exception was thrown resolving an image codec:

I/flutter (10226): Exception: HTTP request failed, statusCode: 400,
I/flutter (10226): https://firebasestorage.googleapis.com/v0/b/treasure-box-77192.appspot.com/o?name=chat%20pics&uploadType=resumable&upload_id=AEnB2UpmH5DrdsOyq48VreISd5kMxrvHzXUYfkqJFjUG8tYkPvF7h8AGpNLGbDjPb3xteeJuyzthmh489jDNqworn4iZFi4gJg&upload_protocol=resumable
I/flutter (10226): 
I/flutter (10226): When the exception was thrown, this was the stack:
I/flutter (10226): #0      NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:90:9)
I/flutter (10226): <asynchronous suspension>
I/flutter (10226): #1      NetworkImage.load (package:flutter/src/painting/_network_image_io.dart:48:14)
I/flutter (10226): #2      ImageProvider.resolve.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:316:48)
I/flutter (10226): #3      ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:160:22)
I/flutter (10226): #4      ImageProvider.resolve.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:316:25)
I/flutter (10226): #5      SynchronousFuture.then (package:flutter/src/foundation/synchronous_future.dart:38:29)
I/flutter (10226): #6      ImageProvider.resolve.<anonymous closure> (package:flutter/src/painting/image_provider.dart:313:11)
I/flutter (10226): #10     ImageProvider.resolve (package:flutter/src/painting/image_provider.dart:305:16)
I/flutter (10226): #11     _ImageState._resolveImage (package:flutter/src/widgets/image.dart:922:20)
I/flutter (10226): #12     _ImageState.didChangeDependencies (package:flutter/src/widgets/image.dart:879:5)
I/flutter (10226): #13     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4051:12)
I/flutter (10226): #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (10226): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (10226): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (10226): #17     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
I/flutter (10226): #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (10226): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (10226): #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #21     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #22     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter (10226): #23     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter (10226): #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (10226): #25     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5198:32)
I/flutter (10226): #26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter (10226): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter (10226): #28     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #30     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #31     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #33     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #34     StatelessElement.update (package:flutter/src/widgets/framework.dart:3981:5)
I/flutter (10226): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #37     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #38     ProxyElement.update (package:flutter/src/widgets/framework.dart:4219:5)
I/flutter (10226): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #40     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #41     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #42     StatefulElement.update (package:flutter/src/widgets/framework.dart:4085:5)
I/flutter (10226): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #45     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #46     StatelessElement.update (package:flutter/src/widgets/framework.dart:3981:5)
I/flutter (10226): #47     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #48     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1181:36)
I/flutter (10226): #49     SliverMultiBoxAdaptorElement.performRebuild.processElement (package:flutter/src/widgets/sliver.dart:1113:34)
I/flutter (10226): #50     Iterable.forEach (dart:core/iterable.dart:277:30)
I/flutter (10226): #51     SliverMultiBoxAdaptorElement.performRebuild (package:flutter/src/widgets/sliver.dart:1139:24)
I/flutter (10226): #52     SliverMultiBoxAdaptorElement.update (package:flutter/src/widgets/sliver.dart:1084:7)
I/flutter (10226): #53     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #54     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #56     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4817:32)
I/flutter (10226): #57     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5208:17)
I/flutter (10226): #58     _ViewportElement.update (package:flutter/src/widgets/viewport.dart:192:11)
I/flutter (10226): #59     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #60     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #61     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #62     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #64     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #66     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #69     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #70     StatefulElement.update (package:flutter/src/widgets/framework.dart:4085:5)
I/flutter (10226): #71     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #72     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #74     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #75     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #76     ProxyElement.update (package:flutter/src/widgets/framework.dart:4219:5)
I/flutter (10226): #77     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #78     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #79     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #80     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #81     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #82     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #83     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #84     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5099:14)
I/flutter (10226): #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #86     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #87     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #88     StatelessElement.update (package:flutter/src/widgets/framework.dart:3981:5)
I/flutter (10226): #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #90     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #91     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #92     StatefulElement.update (package:flutter/src/widgets/framework.dart:4085:5)
I/flutter (10226): #93     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #94     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #95     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #96     StatefulElement.update (package:flutter/src/widgets/framework.dart:4085:5)
I/flutter (10226): #97     Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #98     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #99     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #100    ProxyElement.update (package:flutter/src/widgets/framework.dart:4219:5)
I/flutter (10226): #101    Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #102    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #103    Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #104    StatelessElement.update (package:flutter/src/widgets/framework.dart:3981:5)
I/flutter (10226): #105    Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #106    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #107    Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #108    StatelessElement.update (package:flutter/src/widgets/framework.dart:3981:5)
I/flutter (10226): #109    Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #110    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #111    Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #112    ProxyElement.update (package:flutter/src/widgets/framework.dart:4219:5)
I/flutter (10226): #113    Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #114    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4817:32)
I/flutter (10226): #115    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5208:17)
I/flutter (10226): #116    Element.updateChild (package:flutter/src/widgets/framework.dart:2876:15)
I/flutter (10226): #117    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
I/flutter (10226): #118    Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter (10226): #119    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2340:33)
I/flutter (10226): #120    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)
I/flutter (10226): #121    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter (10226): #122    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1016:15)
I/flutter (10226): #123    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:958:9)
I/flutter (10226): #124    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:874:5)
I/flutter (10226): #128    _invoke (dart:ui/hooks.dart:236:10)
I/flutter (10226): #129    _drawFrame (dart:ui/hooks.dart:194:3)
I/flutter (10226): (elided 6 frames from package dart:async)
I/flutter (10226): 
I/flutter (10226): Image provider:
I/flutter (10226):   NetworkImage("https://firebasestorage.googleapis.com/v0/b/treasure-box-77192.appspot.com/o?name=chat%20pics&uploadType=resumable&upload_id=AEnB2UpmH5DrdsOyq48VreISd5kMxrvHzXUYfkqJFjUG8tYkPvF7h8AGpNLGbDjPb3xteeJuyzthmh489jDNqworn4iZFi4gJg&upload_protocol=resumable",
I/flutter (10226):   scale: 1.0)
I/flutter (10226): Image key:
I/flutter (10226):   NetworkImage("https://firebasestorage.googleapis.com/v0/b/treasure-box-77192.appspot.com/o?name=chat%20pics&uploadType=resumable&upload_id=AEnB2UpmH5DrdsOyq48VreISd5kMxrvHzXUYfkqJFjUG8tYkPvF7h8AGpNLGbDjPb3xteeJuyzthmh489jDNqworn4iZFi4gJg&upload_protocol=resumable",

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.