adityadroid / messio Goto Github PK
View Code? Open in Web Editor NEWAn open source messenger app built using flutter
An open source messenger app built using flutter
I am having two issues on register page. The number picker widget only works if I select an image from gallery first. The background image only gets updated when the image is selected for the first time, it does not work when we select a new image.
How does this work with MainActivity.kt
Also the images arent loading in the attachments page.
import android.media.MediaMetadataRetriever;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static String TAG = "Android Platform";
private static final int HIGH_QUALITY_MIN_VAL = 70;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), "app.messio.channel").setMethodCallHandler(
(call, result) -> {
final Map<String, Object> args = call.arguments();
try {
final String video = (String) args.get("video");
final int format = (int) args.get("format");
final int maxhow = (int) args.get("maxhow");
final int quality = (int) args.get("quality");
new Thread(() -> {
if (call.method.equals("file")) {
final String path = (String) args.get("path");
String data = buildThumbnailFile(video, path, format, maxhow, quality);
runOnUiThread(()-> result.success(data));
} else if (call.method.equals("data")) {
byte[] data = buildThumbnailData(video, format, maxhow, quality);
runOnUiThread(()-> result.success(data));
} else {
runOnUiThread(result::notImplemented);
}
}).start();
} catch (Exception e) {
e.printStackTrace();
result.error("exception", e.getMessage(), null);
}
});
}
private static Bitmap.CompressFormat intToFormat(int format) {
switch (format) {
default:
case 0:
return Bitmap.CompressFormat.JPEG;
case 1:
return Bitmap.CompressFormat.PNG;
case 2:
return Bitmap.CompressFormat.WEBP;
}
}
private static String formatExt(int format) {
switch (format) {
default:
case 0:
return "jpg";
case 1:
return "png";
case 2:
return "webp";
}
}
private byte[] buildThumbnailData(String vidPath, int format, int maxhow, int quality) {
Log.d(TAG, String.format("buildThumbnailData( format:%d, maxhow:%d, quality:%d )", format, maxhow, quality));
Bitmap bitmap = createVideoThumbnail(vidPath, maxhow);
if (bitmap == null)
throw new NullPointerException();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(intToFormat(format), quality, stream);
bitmap.recycle();
if (bitmap == null)
throw new NullPointerException();
return stream.toByteArray();
}
private String buildThumbnailFile(String vidPath, String path, int format, int maxhow, int quality) {
Log.d(TAG, String.format("buildThumbnailFile( format:%d, maxhow:%d, quality:%d )", format, maxhow, quality));
final byte bytes[] = buildThumbnailData(vidPath, format, maxhow, quality);
final String ext = formatExt(format);
final int i = vidPath.lastIndexOf(".");
String fullpath = vidPath.substring(0, i + 1) + ext;
if (path != null) {
if (path.endsWith(ext)) {
fullpath = path;
} else {
// try to save to same folder as the vidPath
final int j = fullpath.lastIndexOf("/");
if (path.endsWith("/")) {
fullpath = path + fullpath.substring(j + 1);
} else {
fullpath = path + fullpath.substring(j);
}
}
}
try {
FileOutputStream f = new FileOutputStream(fullpath);
f.write(bytes);
f.close();
Log.d(TAG, String.format("buildThumbnailFile( written:%d )", bytes.length));
} catch (java.io.IOException e) {
e.getStackTrace();
throw new RuntimeException(e);
}
return fullpath;
}
/**
* Create a video thumbnail for a video. May return null if the video is corrupt
* or the format is not supported.
*
* @param video the URI of video
* @param targetSize max width or height of the thumbnail
*/
public static Bitmap createVideoThumbnail(String video, int targetSize) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
Log.d(TAG, String.format("setDataSource: %s )", video));
if (video.startsWith("file://") || video.startsWith("/")) {
retriever.setDataSource(video);
} else {
retriever.setDataSource(video, new HashMap<String, String>());
}
bitmap = retriever.getFrameAtTime(-1);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
ex.printStackTrace();
}
}
if (bitmap == null)
return null;
if (targetSize != 0) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int max = Math.max(width, height);
float scale = (float) targetSize / max;
int w = Math.round(scale * width);
int h = Math.round(scale * height);
Log.d(TAG, String.format("original w:%d, h:%d, scale:%6.4f => %d, %d", width, height, scale, w, h));
bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
}
return bitmap;
}
}```
kotlin one is
```import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
}
}
I would love to be able to have more than one person in a chat room. Instead of picking a contact, you could pick a chat and join. i'm currently trying to do this myself using messio as a guide, but I get stuck with some of the database tricks, and providers.
File google-services.json is missing. The Google Services Plugin cannot function without it.
Searched Location:
/Users/rahulrawat/tymoffproject/Messio/android/app/src/nullnull/google-services.json
/Users/rahulrawat/tymoffproject/Messio/android/app/src/debug/google-services.json
/Users/rahulrawat/tymoffproject/Messio/android/app/src/nullnullDebug/google-services.json
/Users/rahulrawat/tymoffproject/Messio/android/app/src/nullnull/debug/google-services.json
/Users/rahulrawat/tymoffproject/Messio/android/app/src/debug/nullnull/google-services.json
/Users/rahulrawat/tymoffproject/Messio/android/app/google-services.json
Tag Manager is not found and thus will not be used E/FirebaseInstanceId( 3452): Failed to resolve target intent service, skipping classname enforcement E/FirebaseInstanceId( 3452): Error while delivering the message: ServiceIntent not found. I/flutter ( 3452):
after pressing sign in with google button, i logged in with my google account and after logging also i am unable to proceed ahead,nothing is proceeding after logging in
I get the following errors when I run the latest code base on the latest Master Channel.
/Users/jeremywhiteley/flutter/bin/flutter doctor --verbose
[✓] Flutter (Channel master, v1.10.15-pre.199, on Mac OS X 10.15 19A602, locale en-US)
• Flutter version 1.10.15-pre.199 at /Users/jeremywhiteley/flutter
• Framework revision 22f0bf87e4 (68 minutes ago), 2019-10-21 16:54:02 -0700
• Engine revision 8882bf3c73
• Dart version 2.6.0 (build 2.6.0-dev.8.0 a61c775db8)
Running Gradle task 'assembleDebug'...
Compiler message:
../../../flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-1.1.2+1/lib/src/cached_network_image_provider.dart:53:24: Error: The method 'CachedNetworkImageProvider.load' has fewer positional arguments than those of overridden method 'ImageProvider.load'.
ImageStreamCompleter load(CachedNetworkImageProvider key) {
^
../../../flutter/packages/flutter/lib/src/painting/image_provider.dart:403:24: Context: This is the overridden method ('load').
ImageStreamCompleter load(T key, DecoderCallback decode);
^
../../../flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-1.1.2+1/lib/src/scaled_file_image.dart:45:24: Error: The method 'ScaledFileImage.load' has fewer positional arguments than those of overridden method 'ImageProvider.load'.
ImageStreamCompleter load(ScaledFileImage key) {
^
../../../flutter/packages/flutter/lib/src/painting/image_provider.dart:403:24: Context: This is the overridden method ('load').
ImageStreamCompleter load(T key, DecoderCallback decode);
^
Exception: Errors during snapshot creation: null
#0 KernelSnapshot.build (package:flutter_tools/src/build_system/targets/dart.dart:230:7)
#1 _BuildInstance._invokeInternal (package:flutter_tools/src/build_system/build_system.dart:526:25)
#2 _BuildInstance.invokeTarget. (package:flutter_tools/src/build_system/build_system.dart:481:35)
#3 new Future.sync (dart:async/future.dart:224:31)
#4 AsyncMemoizer.runOnce (package:async/src/async_memoizer.dart:43:45)
#5 _BuildInstance.invokeTarget (package:flutter_tools/src/build_system/build_system.dart:481:21)
#6 BuildSystem.build (package:flutter_tools/src/build_system/build_system.dart:419:36)
#7 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#8 BuildSystem.build (package:flutter_tools/src/build_system/build_system.dart:400:28)
#9 buildWithAssemble (package:flutter_tools/src/bundle.dart:125:48)
#10 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#11 buildWithAssemble (package:flutter_tools/src/bundle.dart:99:31)
#12 BundleBuilder.build (package:flutter_tools/src/bundle.dart:75:11)
#13 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#14 BundleBuilder.build (package:flutter_tools/src/bundle.dart:52:21)
#15 BuildBundleCommand.runCommand (package:flutter_tools/src/commands/build_bundle.dart:126:25)
#16 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#17 BuildBundleCommand.runCommand (package:flutter_tools/src/commands/build_bundle.dart:97:42)
#18 FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:557:18)
#19 _asyncThenWrapperHelper. (dart:async-patch/async_patch.dart:71:64)
#20 _rootRunUnary (dart:async/zone.dart:1132:38)
#21 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#22 _FutureListener.handleValue (dart:async/future_impl.dart:137:18)
#23 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:678:45)
#24 Future._propagateToListeners (dart:async/future_impl.dart:707:32)
#25 Future._completeWithValue (dart:async/future_impl.dart:522:5)
#26 Future._asyncComplete. (dart:async/future_impl.dart:552:7)
#27 _rootRun (dart:async/zone.dart:1124:13)
#28 _CustomZone.run (dart:async/zone.dart:1021:19)
#29 _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#30 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:963:23)
#31 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#32 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#33 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:116:13)
#34 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:173:5)
Failed to build bundle.
FAILURE: Build failed with an exception.
Where:
Script '/Users/jeremywhiteley/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 794
What went wrong:
Execution failed for task ':app:compileFlutterBuildDebugX86'.
Process 'command '/Users/jeremywhiteley/flutter/bin/flutter'' finished with non-zero exit value 1
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org
BUILD FAILED in 42s
Finished with error: Gradle task assembleDebug failed with exit code 1
version 1 removes dispatch(), currentState
Hi, I was thinking and it might be a nice idea that instead of automatically adding in contact in both ends the u should get an accept or ignore on upcoming contact request to avoid random people adding you.
Your "60 Days of Flutter" tutorial is awesome. I see that you have used Firebase for database, authentication and storage. Just wanted to have a quick check if you can publish one similar tutorial using WebRTC.
Your are doing a great work. I appreciate your work. I want to suggest you some ui designs for your app.
Chat ui on dribble
Another social app ui on dribble
And some flutter implementation of another ui to take help
https://github.com/emrade/flutter-ghana-ui-challenge-week-1
If you have time and like these ui designs you can implement them in future . These are just suggestions for you to make your app more attractive.
I am the 27-29 days mark and my login is not working like it should. I'm not sure if my authentication block or the registration page has the problem. Logs are below. Here is also the link to the repository.
https://github.com/Jukez17/WeChat
I/flutter (10482): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:316:33)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:344:48)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #3 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:218:23)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #4 GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:257:20)
I/flutter (10482): #5 GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:324:48)
I/flutter (10482): #6 AuthenticationProvider.signInWithGoogle (package:wechat/providers/AuthenticationProvider.dart:18:28)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #7 AuthenticationRepository.signInWithGoogle (package:wechat/repositories/AuthenticationRepository.dart:9:30)
I/flutter (10482): #8 AuthenticationBloc.mapClickedGoogleLoginToState (package:wechat/blocs/authentication/authentication_bloc.dart:77:42)
I/flutter (10482): <asynchronous suspension
I/flutter (10482): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
I/flutter (10482): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:316:33)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:344:48)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #3 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:218:23)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #4 GoogleSignIn._addMethodCall.<anonymous closure> (package:google_sign_in/google_sign_in.dart:270:28)
I/flutter (10482): #5 _rootRun (dart:async/zone.dart:1120:38)
I/flutter (10482): #6 _CustomZone.run (dart:async/zone.dart:1021:19)
I/flutter (10482): #7 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:161:18)
I/flutter (10482): #8 Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:648:39)
I/flutter (10482): #9 Future._propagateToListeners (dart:async/future_impl.dart:704:37)
I/flutter (10482): #10 Future._addListener.<anonymous closure> (dart:async/future_impl.dart:387:9)
I/flutter (10482): #11 _rootRun
I/flutter (10482): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
I/flutter (10482): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:316:33)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:344:48)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #3 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:218:23)
I/flutter (10482): <asynchronous suspension>
I/flutter (10482): #4 GoogleSignIn._addMethodCall.<anonymous closure> (package:google_sign_in/google_sign_in.dart:270:28)
I/flutter (10482): #5 _rootRun (dart:async/zone.dart:1120:38)
I/flutter (10482): #6 _CustomZone.run (dart:async/zone.dart:1021:19)
I/flutter (10482): #7 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:161:18)
I/flutter (10482): #8 Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:648:39)
I/flutter (10482): #9 Future._propagateToListeners (dart:async/future_impl.dart:704:37)
I/flutter (10482): #10 Future._addListener.<anonymous closure> (dart:async/future_impl.dart:387:9)
I/flutter (10482): #11 _rootRun```
Hi, I have created my own package and followed all your steps. On application start after pressing Sign in with google I get a dialog box with account selection However when I select my gmail , application, there will be a quick flicker on
the screen then application shows me the start page where it asks me to "Sign In with google". I get following error:
W/ActivityThread(29757): handleWindowVisibility: no activity for token android.os.BinderProxy@81c22e0
I/flutter (29757): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
I/flutter (29757): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:316:33)
I/flutter (29757): <asynchronous suspension>
I/flutter (29757): #2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:344:48)
I/flutter (29757): <asynchronous suspension>
I/flutter (29757): #3 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:218:23)
I/flutter (29757): <asynchronous suspension>
I/flutter (29757): #4 GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:257:20)
I/flutter (29757): #5 GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:324:48)
I/flutter (29757): #6 AuthenticationProvider.signInWithGoogle (package:blabla/providers/AuthenticationProvider.dart:18:28)
I/flutter (29757): <asynchronous suspension>
I/flutter (29757): #7 AuthenticationRepository.signInWithGoogle (package:blabla/repositories/AuthenticationRepository.dart:11:30)
I/flutter (29757): #8 AuthenticationBloc.mapClickedGoogleLoginToState (package:blabla/blocs/authentication/AuthenticationBloc.dart:77:42)
I/flutter (29757): <asynchronous suspension
Would it be an possibility to see notifications feature that u can see some form of indication of new messages.
seems that Equatable API had changed and the code at the events part do not build any longer, i have the following code:
import 'dart:io';
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
@immutable
abstract class AuthenticationEvent extends Equatable {
const AuthenticationEvent([List props = const []]) : super();
}
class ScreenEntered extends AuthenticationEvent {
@OverRide
String toSring() => "ScreenEntered";
}
and getting an error that i am missing a getter for Equatable.props, i think this is related to API change
TODO:
Brings the tests up to speed and also fix the CI pipeline.
I get this error at compile time.
"Missing an android \AndroidManifest.xml"
The chat item widget is showing errors after implementing the slide down gesture to collapse the conversation list.
The errors are
Incorrect use of Parentdatawidget.
Flexible widgets must be placed directly
inside Flex widgets.
Flexible (no depth, flex: 1, dirty has a
Flex ancestor, but there are other widgets
between them:
KeepAlive
I'm having a problem while creating blocs. Every time I create a package named blocs and add another package with name authentication, it automatically turns to blocs.authentication and try to add blocs using the plugin you suggested it forms lowercase lettered blocs with underscores
and the RegisterPage.dart is also not recognizing that.
Why does the attachments won't load and there is infite loading icon. @adityadroid
and the errors:
``I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): Received InitialAttachmentsState
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
I/flutter ( 6782): Received InitialAttachmentsState in ui
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.ANY }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 3
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 3 order by -timeStamp) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.ANY }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 3
I/flutter ( 6782): Received InitialAttachmentsState
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 3 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
I/flutter ( 6782): Received InitialAttachmentsState
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 1 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): Received InitialAttachmentsState
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.VIDEO }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 2
W/Firestore( 6782): (19.0.0) [Firestore]: Listen for Query(chats/JrSA0KXWo9xg85WY3tkU/messages where type == 2 order by -timeStamp, -name) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wechat-e63c1/firestore/indexes?create_composite=Ck1wcm9qZWN0cy93ZWNoYXQtZTYzYzEvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL21lc3NhZ2VzL2luZGV4ZXMvXxABGggKBHR5cGUQARoNCgl0aW1lU3RhbXAQAhoMCghfX25hbWVfXxAC, cause=null}
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
W/.example.wecha( 6782): Accessing hidden method Ldalvik/system/CloseGuard;->close()V (light greylist, linking)
logs:
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): Received InitialAttachmentsState
I/flutter ( 6782): FetchAttachmentsEvent { chatId : JrSA0KXWo9xg85WY3tkU fileType : FileType.IMAGE }
I/flutter ( 6782): for chat id JrSA0KXWo9xg85WY3tkU 1
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
I/flutter ( 6782): FetchChatListEvent
I/flutter ( 6782): ReceivedChatsEvent
I/flutter ( 6782): ChatList [{ username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}]
I/flutter ( 6782): build of { username= luizella, chatId = JrSA0KXWo9xg85WY3tkU}
I/flutter ( 6782): chatlist
I/flutter ( 6782): FetchedChatListState
The one feature that I miss from ICQ was the ability to see the other person typing in real time. To improve on this, you can add a condition such that both parties need to have this option enabled in order to see each other's responses in real time.
Here's the error messages:
n)
Compiler message:
/d:/flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-1.1.1/lib/src/cached_network_image_provider.dart:42:24: Error: The method 'CachedNetworkImageProvider.load' has fewer positional arguments than those of overridden method 'ImageProvider.load'.
ImageStreamCompleter load(CachedNetworkImageProvider key) {
^
/d:/flutter/packages/flutter/lib/src/painting/image_provider.dart:403:24: Context: This is the overridden method ('load').
ImageStreamCompleter load(T key, DecoderCallback decode);
^
Target kernel_snapshot failed: Exception: Errors during snapshot creation: null
build failed.
FAILURE: Build failed with an exception.
Here are my flutter details:
Flutter 1.12.13+hotfix.9 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f139b11009 (4 weeks ago) • 2020-03-30 13:57:30 -0700
Engine • revision af51afceb8
Tools • Dart 2.7.2
When I try to add a user that is in the database and I have the correct username but I keep getting user not found
here is the rules for the db. I am wondering if this is related to the code or the rules? Also code here https://github.com/Jukez17/WeChat
service cloud.firestore {
match /databases/{database}/documents {
match /users/{document=**} {
function isSignedIn() {
return request.auth.uid != null;
}
//Allow creating a new user to anyone who is authenticated
allow create: if isSignedIn();
//Allow read if signed in
allow read: if isSignedIn();
// Allow update only if the uid matches (same user)
allow update: if isSignedIn();// && request.auth.uid == resource.data.uid;
// Allow delete only if the uid matches (same user)
allow delete: if isSignedIn();// && request.auth.uid == resource.data.uid;
match /contacts/{contacts} {
allow create, read, update, delete: if isSignedIn();
}
}
match /username_uid_map/{document=**} {
function isSignedIn() {
return request.auth.uid != null;
}
allow create, read, update, delete : if isSignedIn();
}
match /chats/{document=**} {
function isSignedIn() {
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{document=**} {
function isSignedIn() {
return request.auth.uid != null;
}
//Allow creating a new user to anyone who is authenticated
allow create: if isSignedIn();
//Allow read if signed in
allow read: if isSignedIn();
// Allow update only if the uid matches (same user)
allow update: if isSignedIn();// && request.auth.uid == resource.data.uid;
// Allow delete only if the uid matches (same user)
allow delete: if isSignedIn();// && request.auth.uid == resource.data.uid;
match /contacts/{contacts} {
allow create, read, update, delete: if isSignedIn();
}
}
match /username_uid_map/{document=**} {
function isSignedIn() {
return request.auth.uid != null;
}
allow create, read, update, delete : if isSignedIn();
}
match /chats/{document=**} {
function isSignedIn() {
return request.auth.uid != null;
}
allow create, read, update, delete : if isSignedIn();
}
}
}return request.auth.uid != null;
}
allow create, read, update, delete : if isSignedIn();
}
}
Hi,
first great job !!
I'm stuck on #day-24-26 ; I cannot understand the "add contact" workflow.
Why did the method addContact(String username) calls on first line getUser(username); ??
And from the the list getContacts, we should read contacts from firebase
but I don't see where they are inserted in firebase.
At line 99, app crashes because contact never exists as user in db...
for (String username in contacts) {
print(username);
// This failed =>
// String uid = await getUidByUsername(username);
// DocumentSnapshot contactSnapshot = await userRef.document(uid).get();
// contactList.add(Contact.fromFirestore(contactSnapshot));
// bad workaround =>
contactList.add(Contact(uid, username, username));
}
Thanks to help me to understand this part !
Hey Aditya congrats on almost reaching the end of you 60 day challenge, do you plan to implement stories as well?
Could you help me on this stage :
Update failed when i try to update 'latestMessage' fields.
ChatProvider Line72
await chatDocRef.updateData({'latestMessage': message.toMap()});
I tried with your project (pull 22 and 23) as well, and I have the same behavior.
Comment this line, has not a big effect too, because UI is strange : no ChatAppBar, no messages list in UI
sendMessage works because data is stored, but that's all.
Any idea ? thanks in advance
Hi first great tutorial :)
but on day https://medium.com/@adityadroid/60-days-of-flutter-day-3-4-building-a-chat-screen-in-flutter-e2ed36388dc7, I had an issue around Flexible.
I tried to wrap Flexible from ChatListWidget with Column. It works but input is above list, not under.
// A Flexible widget must be a descendant of a Row, Column, or Flex,
// https://api.flutter.dev/flutter/widgets/Flexible-class.html
Tried with your code, same issue. May be an issue around flutter upgrade ?
Hello,
thank you really much for this, i would really like to enjoy your ride 💯
There are some inconsitences using new
or variable declaration (type inferences).
I would like to request to omit new
overall and to omit type assignment where ever useful to shorten the code:
class _ConversationPageState extends State<ConversationPage> {
// final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
Good time to you
Hello, Mr. Aditya Gurjar, and thank you for this project.
I am unable to see my chat messages in the home screen and messages bottom sheet, after sending/receiving messages to/from my contacts.
When I am in the home screen, I no longer see the CircularProgressIndicator() spinning, which to me is an indicator that the chat messages have been fetched, but then I see no chat messages listed.
I am running a clone of this project, and I have done the Firebase setup. I have also created the composite index, as instructed by Firebase.
Here is the log from my Debug Console.
Launching lib\main.dart on Infinix X572 in debug mode...
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
Built build\app\outputs\apk\debug\app-debug.apk.
W/DynamiteModule(22933): Local module descriptor class for providerinstaller not found.
I/DynamiteModule(22933): Considering local module providerinstaller:0 and remote module providerinstaller:0
W/ProviderInstaller(22933): Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
W/asset (22933): Asset path /system/framework/OSIcon/OSIcon.apk is neither a directory nor file (type=1).
W/asset (22933): AssetManager-->addDefaultAssets isok4 is false
I/zygote64(22933): The ClassLoaderContext is a special shared library.
I/zygote64(22933): The ClassLoaderContext is a special shared library.
V/NativeCrypto(22933): Registering com/google/android/gms/org/conscrypt/NativeCrypto's 284 native methods...
D/NetworkSecurityConfig(22933): No Network Security Config specified, using platform default
I/ProviderInstaller(22933): Installed default security provider GmsCore_OpenSSL
I/flutter (22933): AppLaunched
D/HWUIExtension(22933): MTKProgramCache.generateProgram: 562984313159681
D/HWUIExtension(22933): createProgram 0x0002000800000001, binary 0x74e07faf78, length 5252, format 36705 within 5445ns
I/zygote64(22933): Do partial code cache collection, code=61KB, data=40KB
I/zygote64(22933): After code cache collection, code=61KB, data=40KB
I/zygote64(22933): Increasing code cache capacity to 256KB
I/System.out(22933): port:443
I/flutter (22933): true
I/flutter (22933): FetchChatListEvent
I/flutter (22933): FetchHomeChatsEvent
I/flutter (22933): ReceivedChatsEvent
I/flutter (22933): ReceivedChatsEvent
Any help will be greatly appreciated. Thank you.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.