update single_conversation example

This commit is contained in:
Salvatore Giordano
2020-02-24 16:20:48 +01:00
parent 9f22241f89
commit d3b6a7e5e5
13 changed files with 714 additions and 260 deletions
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="salvatoregiordano">
<words>
<w>typings</w>
</words>
</dictionary>
</component>
+214 -157
View File
@@ -2,18 +2,17 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="8a42da92-86e3-4aa3-b70d-cc6a9fefa34f" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/lib/src/message_input.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/libraries/Dart_Packages.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/libraries/Dart_Packages.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/stream-chat-flutter.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/stream-chat-flutter.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/dictionaries/salvatoregiordano.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/example/lib/multiple_conversation.dart" afterDir="false" />
<change afterPath="$PROJECT_DIR$/lib/src/channel_image.dart" afterDir="false" />
<change afterPath="$PROJECT_DIR$/lib/src/channel_list_view.dart" afterDir="false" />
<change afterPath="$PROJECT_DIR$/lib/src/channel_name_text.dart" afterDir="false" />
<change afterPath="$PROJECT_DIR$/lib/src/channel_preview.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/analysis_options.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/analysis_options.yaml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/src/message_list_view.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/src/message_list_view.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/src/message_widget.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/src/message_widget.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/example/lib/single_conversation.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/single_conversation.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/example/test/widget_test.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/test/widget_test.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/src/stream_channel.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/src/stream_channel.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/src/stream_chat.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/src/stream_chat.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/src/user_avatar.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/src/user_avatar.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/stream_chat_flutter.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/stream_chat_flutter.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.yaml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -26,38 +25,77 @@
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/stream_chat_flutter.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="31" selection-start-line="5" selection-start-column="31" selection-end-line="5" selection-end-column="31" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/../stream_chat_dart/lib/src/api/channel_client.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="580">
<caret line="66" column="19" selection-start-line="66" selection-start-column="19" selection-end-line="66" selection-end-column="19" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/analysis_options.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="796">
<state relative-caret-position="799">
<caret line="47" column="28" selection-start-line="47" selection-start-column="28" selection-end-line="47" selection-end-column="28" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/example/pubspec.yaml">
<entry file="file://$PROJECT_DIR$/../stream_chat_dart/lib/src/client.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="10" column="16" selection-start-line="10" selection-start-column="16" selection-end-line="10" selection-end-column="16" />
<state relative-caret-position="485">
<caret line="70" column="38" selection-start-line="70" selection-start-column="38" selection-end-line="70" selection-end-column="38" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/channel_list_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="890">
<caret line="133" column="14" selection-start-line="133" selection-start-column="14" selection-end-line="133" selection-end-column="14" />
<folding>
<element signature="e#0#39#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/channel_preview.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="52" column="40" selection-start-line="52" selection-start-column="40" selection-end-line="52" selection-end-column="40" />
<folding>
<element signature="e#0#46#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/stream_chat.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="25" selection-start-line="14" selection-start-column="25" selection-end-line="14" selection-end-column="25" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/stream_channel.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1213">
<caret line="102" selection-start-line="102" selection-end-line="102" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/stream_chat_flutter.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="31" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" />
</state>
</provider>
</entry>
@@ -65,7 +103,7 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/message_list_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1700">
<state relative-caret-position="874">
<caret line="207" column="30" selection-start-line="207" selection-start-column="30" selection-end-line="207" selection-end-column="30" />
<folding>
<element signature="e#0#20#0" expanded="true" />
@@ -75,61 +113,15 @@
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/message_widget.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="875">
<caret line="79" column="26" selection-start-line="79" selection-start-column="26" selection-end-line="79" selection-end-column="26" />
<folding>
<element signature="e#0#64#0" expanded="true" />
</folding>
</state>
</provider>
<entry file="file://$PROJECT_DIR$/lib/src/channel_name_text.dart">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/message_input.dart">
<entry file="file://$PROJECT_DIR$/lib/src/channel_image.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="7" column="16" selection-start-line="7" selection-start-column="16" selection-end-line="7" selection-end-column="16" />
<folding>
<element signature="e#0#17#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/user_avatar.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="14" selection-start-line="17" selection-start-column="14" selection-end-line="17" selection-end-column="14" />
<folding>
<element signature="e#0#64#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/stream_channel.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/stream_chat.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="578">
<caret line="34" column="13" selection-start-line="34" selection-start-column="13" selection-end-line="34" selection-end-column="13" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
<state relative-caret-position="34">
<caret line="2" column="28" selection-start-line="2" selection-start-column="28" selection-end-line="2" selection-end-column="28" />
</state>
</provider>
</entry>
@@ -152,6 +144,9 @@
<find>onThreadSelect</find>
<find>build</find>
<find>channelClient</find>
<find>dispose</find>
<find>CHANNEL-</find>
<find>_userController</find>
</findStrings>
</component>
<component name="Git.Settings">
@@ -162,17 +157,22 @@
<list>
<option value="$PROJECT_DIR$/CHANGELOG.md" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/lib/src/stream_chat.dart" />
<option value="$PROJECT_DIR$/example/pubspec.yaml" />
<option value="$PROJECT_DIR$/pubspec.yaml" />
<option value="$PROJECT_DIR$/analysis_options.yaml" />
<option value="$PROJECT_DIR$/lib/src/user_avatar.dart" />
<option value="$PROJECT_DIR$/lib/src/message_widget.dart" />
<option value="$PROJECT_DIR$/lib/stream_chat_flutter.dart" />
<option value="$PROJECT_DIR$/lib/src/message_input.dart" />
<option value="$PROJECT_DIR$/lib/src/message_list_view.dart" />
<option value="$PROJECT_DIR$/example/lib/main.dart" />
<option value="$PROJECT_DIR$/lib/src/channel_image.dart" />
<option value="$PROJECT_DIR$/lib/src/channel_preview.dart" />
<option value="$PROJECT_DIR$/lib/stream_chat_flutter.dart" />
<option value="$PROJECT_DIR$/lib/src/stream_channel.dart" />
<option value="$PROJECT_DIR$/example/lib/multiple_conversation.dart" />
<option value="$PROJECT_DIR$/example/lib/single_conversation.dart" />
<option value="$PROJECT_DIR$/lib/src/stream_chat.dart" />
<option value="$PROJECT_DIR$/lib/src/channel_list_view.dart" />
</list>
</option>
</component>
@@ -185,6 +185,7 @@
<option value="$PROJECT_DIR$/.idea/codeStyles/Project.xml" />
<option value="$PROJECT_DIR$/.idea/libraries/Flutter_Plugins.xml" />
<option value="$PROJECT_DIR$/.idea/libraries/Dart_Packages.xml" />
<option value="$PROJECT_DIR$/.idea/dictionaries/salvatoregiordano.xml" />
</list>
</option>
</component>
@@ -206,11 +207,6 @@
<item name="stream-chat-flutter" type="b2602c69:ProjectViewProjectNode" />
<item name="stream-chat-flutter" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="stream-chat-flutter" type="b2602c69:ProjectViewProjectNode" />
<item name="stream-chat-flutter" type="462c0819:PsiDirectoryNode" />
<item name="example" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="stream-chat-flutter" type="b2602c69:ProjectViewProjectNode" />
<item name="stream-chat-flutter" type="462c0819:PsiDirectoryNode" />
@@ -244,14 +240,6 @@
<item name="lib" type="e6ad2126:DartTreeStructureProvider$DartSdkOrLibraryRootNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="stream-chat-flutter" type="b2602c69:ProjectViewProjectNode" />
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
<item name="Dart Packages" type="3dd79eb:DartTreeStructureProvider$1" />
<item name="lib" type="e6ad2126:DartTreeStructureProvider$DartSdkOrLibraryRootNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="api" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
@@ -324,6 +312,31 @@
<window_info anchor="right" id="Palette&#9;" order="4" />
<window_info anchor="right" id="Flutter Performance" order="5" />
</layout>
<layout-to-restore>
<window_info id="Captures" order="0" weight="0.25" />
<window_info active="true" content_ui="combo" id="Project" order="1" visible="true" weight="0.16541755" />
<window_info id="Structure" order="2" side_tool="true" />
<window_info id="Image Layers" order="3" />
<window_info id="Designer" order="4" />
<window_info id="Resources Explorer" order="5" />
<window_info id="Capture Tool" order="6" />
<window_info id="Favorites" order="7" side_tool="true" />
<window_info anchor="bottom" id="Dart Analysis" order="0" weight="0.32974505" />
<window_info anchor="bottom" id="Run" order="1" />
<window_info anchor="bottom" id="Find" order="2" weight="0.32974505" />
<window_info anchor="bottom" id="Debug" order="3" />
<window_info anchor="bottom" id="Messages" order="4" weight="0.32974505" />
<window_info anchor="bottom" id="Version Control" order="5" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Terminal" order="7" weight="0.32974505" />
<window_info anchor="bottom" id="Event Log" order="8" side_tool="true" />
<window_info anchor="right" id="Capture Analysis" order="0" />
<window_info anchor="right" id="Theme Preview" order="1" />
<window_info anchor="right" id="Flutter Inspector" order="2" />
<window_info anchor="right" id="Flutter Outline" order="3" />
<window_info anchor="right" id="Palette&#9;" order="4" />
<window_info anchor="right" id="Flutter Performance" order="5" />
</layout-to-restore>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/README.md">
@@ -333,13 +346,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="15" selection-start-line="2" selection-start-column="15" selection-end-line="2" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/test/widget_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
@@ -350,14 +356,7 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="25" selection-start-column="25" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
<entry file="file://$PROJECT_DIR$/example/lib/single_conversation.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" column="6" selection-start-line="11" selection-start-column="6" selection-end-line="11" selection-end-column="6" />
@@ -374,13 +373,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/analysis_options.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="796">
<caret line="47" column="28" selection-start-line="47" selection-start-column="28" selection-end-line="47" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/user_avatar.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
@@ -411,43 +403,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/stream_chat_flutter.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="31" selection-start-line="5" selection-start-column="31" selection-end-line="5" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/stream_chat.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="578">
<caret line="34" column="13" selection-start-line="34" selection-start-column="13" selection-end-line="34" selection-end-column="13" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/message_list_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1700">
<caret line="207" column="30" selection-start-line="207" selection-start-column="30" selection-end-line="207" selection-end-column="30" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/stream_channel.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../stream_chat_dart/lib/src/api/channel_client.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="580">
@@ -455,5 +410,107 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="25" selection-start-column="25" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="15" selection-start-line="2" selection-start-column="15" selection-end-line="2" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/analysis_options.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="799">
<caret line="47" column="28" selection-start-line="47" selection-start-column="28" selection-end-line="47" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/channel_image.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="28" selection-start-line="2" selection-start-column="28" selection-end-line="2" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/channel_name_text.dart">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/lib/stream_chat_flutter.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="31" selection-start-line="6" selection-start-column="31" selection-end-line="6" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/message_list_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="874">
<caret line="207" column="30" selection-start-line="207" selection-start-column="30" selection-end-line="207" selection-end-column="30" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/channel_preview.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="52" column="40" selection-start-line="52" selection-start-column="40" selection-end-line="52" selection-end-column="40" />
<folding>
<element signature="e#0#46#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../flutter/packages/flutter/lib/src/widgets/async.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="580">
<caret line="383" column="14" selection-start-line="383" selection-start-column="14" selection-end-line="383" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/stream_channel.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1213">
<caret line="102" selection-start-line="102" selection-end-line="102" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../stream_chat_dart/lib/src/client.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="485">
<caret line="70" column="38" selection-start-line="70" selection-start-column="38" selection-end-line="70" selection-end-column="38" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/stream_chat.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="25" selection-start-line="14" selection-start-column="25" selection-end-line="14" selection-end-column="25" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/channel_list_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="890">
<caret line="133" column="14" selection-start-line="133" selection-start-column="14" selection-end-line="133" selection-end-column="14" />
<folding>
<element signature="e#0#39#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>
+78
View File
@@ -0,0 +1,78 @@
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
void main() async {
final client = Client('qk4nn7rpcn75');
await client.setUser(
User(id: "wild-breeze-7"),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoid2lsZC1icmVlemUtNyJ9.VM2EX1EXOfgqa-bTH_3JzeY0T99ngWzWahSauP3dBMo',
);
runApp(StreamChat(
client: client,
child: MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ChannelListPage(),
);
}
}
class ChannelListPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ChannelListView(
filter: {
'members': {
'\$in': [StreamChat.of(context).user.id],
}
},
sort: [SortOption("last_message_at")],
pagination: PaginationParams(
limit: 20,
),
onChannelTap: (channelClient) {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return ChannelPage(channelClient);
}));
},
),
);
}
}
class ChannelPage extends StatelessWidget {
ChannelPage(this.channelClient);
final ChannelClient channelClient;
@override
Widget build(BuildContext context) {
return StreamChannel(
channelClient: channelClient,
child: Scaffold(
body: Column(
children: <Widget>[
Expanded(child: MessageListView()),
MessageInput(),
],
),
),
);
}
}
+25 -63
View File
@@ -1,74 +1,36 @@
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
void main() {
void main() async {
final client = Client('qk4nn7rpcn75');
runApp(StreamChat(
client: client,
child: MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
await client.setUser(
User(id: "wild-breeze-7"),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoid2lsZC1icmVlemUtNyJ9.VM2EX1EXOfgqa-bTH_3JzeY0T99ngWzWahSauP3dBMo',
);
class _MyAppState extends State<MyApp> {
ChannelClient _channelClient;
final channelClient = client.channel('messaging', id: 'godevs');
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ChannelPage(_channelClient),
);
}
channelClient.watch();
@override
void initState() {
super.initState();
final streamChat = StreamChat.of(context);
_channelClient = streamChat.client.channel('messaging', id: 'godevs');
streamChat
.setUser(
User(id: "wild-breeze-7"),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoid2lsZC1icmVlemUtNyJ9.VM2EX1EXOfgqa-bTH_3JzeY0T99ngWzWahSauP3dBMo',
)
.then((_) {
_channelClient.watch();
});
}
@override
void dispose() {
StreamChat.of(context).dispose();
super.dispose();
}
}
class ChannelPage extends StatelessWidget {
ChannelPage(this.channelClient);
final ChannelClient channelClient;
@override
Widget build(BuildContext context) {
return StreamChannel(
channelClient: channelClient,
child: Scaffold(
body: Column(
children: <Widget>[
Expanded(child: MessageListView()),
MessageInput(),
],
runApp(
MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channelClient: channelClient,
child: Scaffold(
body: Column(
children: <Widget>[
Expanded(
child: MessageListView(),
),
MessageInput(),
],
),
),
),
),
);
}
),
);
}
+1 -1
View File
@@ -7,7 +7,7 @@
import 'package:example/single_conversation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_testdart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+25
View File
@@ -0,0 +1,25 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart';
class ChannelImage extends StatelessWidget {
const ChannelImage({
Key key,
@required this.channel,
}) : super(key: key);
final Channel channel;
@override
Widget build(BuildContext context) {
return CircleAvatar(
radius: 20,
backgroundImage: channel.extraData.containsKey('image')
? CachedNetworkImageProvider(channel.extraData['image'] as String)
: null,
child: channel.extraData.containsKey('image')
? null
: Text(channel.config.name[0]),
);
}
}
+177
View File
@@ -0,0 +1,177 @@
import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart';
import 'channel_preview.dart';
import 'stream_channel.dart';
import 'stream_chat.dart';
typedef ChannelPreviewBuilder = Widget Function(BuildContext, ChannelState);
typedef ChannelTapCallback = void Function(ChannelClient);
class ChannelListView extends StatefulWidget {
ChannelListView({
Key key,
ChannelPreviewBuilder channelPreviewBuilder,
this.filter,
this.options,
this.sort,
this.pagination,
this.onChannelTap,
}) : _channelPreviewBuilder = channelPreviewBuilder,
super(key: key);
final Map<String, dynamic> filter;
final Map<String, dynamic> options;
final List<SortOption> sort;
final PaginationParams pagination;
final ScrollController _scrollController = ScrollController();
final ChannelTapCallback onChannelTap;
final ChannelPreviewBuilder _channelPreviewBuilder;
@override
_ChannelListViewState createState() => _ChannelListViewState();
}
class _ChannelListViewState extends State<ChannelListView> {
@override
Widget build(BuildContext context) {
final streamChat = StreamChat.of(context);
return RefreshIndicator(
onRefresh: () async {
streamChat.clearChannels();
return streamChat.queryChannels(
filter: widget.filter,
sortOptions: widget.sort,
paginationParams: widget.pagination,
options: widget.options,
);
},
child: StreamBuilder<List<ChannelState>>(
stream: streamChat.channelsStream,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
if (snapshot.hasError) {
print((snapshot.error as Error).stackTrace);
return Center(
child: Text(snapshot.error.toString()),
);
}
final channelsStates = snapshot.data;
return ListView.custom(
physics: AlwaysScrollableScrollPhysics(),
controller: widget._scrollController,
childrenDelegate: SliverChildBuilderDelegate(
(context, i) {
return _itemBuilder(context, i, channelsStates);
},
childCount: (channelsStates.length * 2) + 1,
findChildIndexCallback: (key) {
final ValueKey<String> valueKey = key;
final index = channelsStates.indexWhere(
(cs) => 'CHANNEL-${cs.channel.id}' == valueKey.value);
return index != -1 ? (index * 2) : null;
},
),
);
}),
);
}
Widget _itemBuilder(context, int i, List<ChannelState> channelsStates) {
if (i % 2 != 0) {
return _separatorBuilder(context, i);
}
i = i ~/ 2;
final streamChat = StreamChat.of(context);
if (i < channelsStates.length) {
final channelState = channelsStates[i];
final channelClient =
streamChat.client.channelClients[channelState.channel.id];
Widget child;
if (widget._channelPreviewBuilder != null) {
child = widget._channelPreviewBuilder(context, channelState);
} else {
child = ChannelPreview(
onTap: widget?.onChannelTap != null
? () {
widget?.onChannelTap(channelClient);
}
: null,
);
}
return StreamChannel(
key: ValueKey<String>('CHANNEL-${channelClient.id}'),
child: child,
channelClient: channelClient,
);
} else {
return _buildQueryProgressIndicator(context, streamChat);
}
}
Widget _buildQueryProgressIndicator(context, StreamChat streamChat) {
return StreamBuilder<bool>(
stream: streamChat.queryChannelsLoading,
initialData: false,
builder: (context, snapshot) {
return Container(
height: 100,
padding: EdgeInsets.all(32),
child: Center(
child: snapshot.data ? CircularProgressIndicator() : Container(),
),
);
});
}
Widget _separatorBuilder(context, i) {
return Container(
height: 1,
color: Colors.black.withOpacity(0.1),
margin: EdgeInsets.symmetric(horizontal: 16),
);
}
void _listenChannelPagination(StreamChat streamChat) {
if (widget._scrollController.position.maxScrollExtent ==
widget._scrollController.position.pixels) {
streamChat.queryChannels(
filter: widget.filter,
sortOptions: widget.sort,
paginationParams: widget.pagination.copyWith(
offset: streamChat.channels.length,
),
options: widget.options,
);
}
}
@override
void initState() {
super.initState();
final streamChat = StreamChat.of(context);
streamChat.queryChannels(
filter: widget.filter,
sortOptions: widget.sort,
paginationParams: widget.pagination,
options: widget.options,
);
widget._scrollController.addListener(() {
_listenChannelPagination(streamChat);
});
}
}
+19
View File
@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart';
class ChannelNameText extends StatelessWidget {
const ChannelNameText({
Key key,
this.channel,
}) : super(key: key);
final Channel channel;
@override
Widget build(BuildContext context) {
return Text(
channel.extraData['name'] as String ?? channel.config.name,
style: Theme.of(context).textTheme.body2,
);
}
}
+148
View File
@@ -0,0 +1,148 @@
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:stream_chat/stream_chat.dart';
import 'channel_image.dart';
import 'channel_name_text.dart';
import 'stream_channel.dart';
import 'stream_chat.dart';
class ChannelPreview extends StatelessWidget {
final VoidCallback onTap;
const ChannelPreview({
Key key,
@required this.onTap,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final streamChannel = StreamChannel.of(context);
return StreamBuilder<ChannelState>(
stream: streamChannel.channelClient.state.channelStateStream,
initialData: streamChannel.channelState,
builder: (context, snapshot) {
final channelState = snapshot.data;
return _buildChannelPreview(
context,
channelState,
streamChannel,
);
});
}
StreamChannel _buildChannelPreview(
BuildContext context,
ChannelState channelState,
StreamChannelState streamChannel,
) {
return StreamChannel(
channelClient:
StreamChat.of(context).client.channelClients[channelState.channel.id],
child: ListTile(
onTap: () {
if (onTap != null) {
onTap();
}
},
leading: ChannelImage(
channel: channelState.channel,
),
title: ChannelNameText(
channel: channelState.channel,
),
subtitle: _buildSubtitle(
streamChannel,
),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
_buildDate(context, channelState.channel.lastMessageAt),
],
),
),
);
}
Text _buildDate(BuildContext context, DateTime lastMessageAt) {
String stringDate;
final now = DateTime.now();
if (now.year != lastMessageAt.year ||
now.month != lastMessageAt.month ||
now.day != lastMessageAt.day) {
stringDate =
'${lastMessageAt.day}/${lastMessageAt.month}/${lastMessageAt.year}';
stringDate = formatDate(lastMessageAt, [dd, '/', mm, '/', yyyy]);
} else {
stringDate = '${lastMessageAt.hour}:${lastMessageAt.minute}';
stringDate = formatDate(lastMessageAt, [HH, ':', nn]);
}
return Text(
stringDate,
style: Theme.of(context).textTheme.caption,
);
}
Widget _buildSubtitle(
StreamChannelState streamChannel,
) {
return StreamBuilder<List<User>>(
stream: streamChannel.channelClient.state.typingEventsStream,
initialData: [],
builder: (context, snapshot) {
final typings = snapshot.data;
final opacity =
streamChannel.channelClient.state.unreadCount > .0 ? 1.0 : 0.5;
return typings.isNotEmpty
? _buildTypings(typings, context, opacity)
: _buildLastMessage(context, streamChannel, opacity);
});
}
Widget _buildLastMessage(
BuildContext context, StreamChannelState streamChannel, double opacity) {
final lastMessage = streamChannel.channelState.messages.isNotEmpty
? streamChannel.channelState.messages.last
: null;
if (lastMessage == null) {
return SizedBox.fromSize(
size: Size.zero,
);
}
final prefix = lastMessage.attachments
.map((e) {
if (e.type == 'image') {
return '📷';
} else if (e.type == 'video') {
return '🎬';
}
return null;
})
.where((e) => e != null)
.join(' ');
return Text(
'$prefix ${lastMessage.text ?? ''}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.caption.copyWith(
color: Colors.black.withOpacity(opacity),
),
);
}
Text _buildTypings(List<User> typings, BuildContext context, double opacity) {
return Text(
'${typings.map((u) => u.extraData.containsKey('name') ? u.extraData['name'] : u.id).join(',')} ${typings.length == 1 ? 'is' : 'are'} typing...',
maxLines: 1,
style: Theme.of(context).textTheme.caption.copyWith(
color: Colors.black.withOpacity(opacity),
),
);
}
}
+1 -1
View File
@@ -256,7 +256,7 @@ class _MessageListViewState extends State<MessageListView> {
_messages = newMessages;
});
} else if (newMessages.first.user.id ==
streamChannel.channelClient.client.user.id) {
streamChannel.channelClient.client.state.user.id) {
_scrollController.jumpTo(0);
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
+16 -19
View File
@@ -30,18 +30,18 @@ class StreamChannel extends StatefulWidget {
}
@override
StreamChannelState createState() => StreamChannelState(channelClient);
StreamChannelState createState() => StreamChannelState();
}
class StreamChannelState extends State<StreamChannel> {
final ChannelClient channelClient;
StreamChannelState();
StreamChannelState(this.channelClient);
ChannelClient get channelClient => widget.channelClient;
ChannelState get channelState => channelClient.state.channelState;
ChannelState get channelState => widget.channelClient.state.channelState;
Stream<ChannelState> get channelStateStream =>
channelClient.state.channelStateStream;
widget.channelClient.state.channelStateStream;
final BehaviorSubject<bool> _queryMessageController = BehaviorSubject();
@@ -55,7 +55,7 @@ class StreamChannelState extends State<StreamChannel> {
firstId = channelState.messages.first.id;
}
channelClient
widget.channelClient
.query(
messagesPagination: PaginationParams(
lessThan: firstId,
@@ -73,11 +73,11 @@ class StreamChannelState extends State<StreamChannel> {
_queryMessageController.add(true);
String firstId;
if (channelClient.state.threads.containsKey(parentId)) {
firstId = channelClient.state.threads[parentId].first.id;
if (widget.channelClient.state.threads.containsKey(parentId)) {
firstId = widget.channelClient.state.threads[parentId].first.id;
}
return channelClient
return widget.channelClient
.getReplies(
parentId,
PaginationParams(
@@ -95,29 +95,26 @@ class StreamChannelState extends State<StreamChannel> {
@override
void dispose() {
_queryMessageController.close();
channelClient.dispose();
widget.channelClient.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
if (channelClient == null) {
if (widget.channelClient == null) {
return Center(
child: CircularProgressIndicator(),
);
}
return FutureBuilder<bool>(
future: channelClient.initialized,
future: widget.channelClient.initialized,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
} else if (snapshot.hasError) {
return Center(
+2 -19
View File
@@ -27,25 +27,9 @@ class StreamChat extends InheritedWidget {
}));
}
User get user => _userController.value;
User get user => client.state.user;
Stream<User> get userStream => _userController.stream;
final BehaviorSubject<User> _userController = BehaviorSubject();
Future<void> setUser(User newUser, [String token]) async {
_userController.sink.add(null);
try {
if (token != null) {
await client.setUser(newUser, token);
} else {
await client.setUserWithProvider(newUser);
}
_userController.sink.add(newUser);
} catch (e, stack) {
_userController.sink.addError(e, stack);
}
}
Stream<User> get userStream => client.state.userStream;
Stream<List<ChannelState>> get channelsStream => _channelsController.stream;
final BehaviorSubject<List<ChannelState>> _channelsController =
@@ -91,7 +75,6 @@ class StreamChat extends InheritedWidget {
void dispose() {
client.dispose();
_subscriptions.forEach((s) => s.cancel());
_userController.close();
_queryChannelsLoadingController.close();
_channelsController.close();
}
+1
View File
@@ -1,5 +1,6 @@
export 'package:stream_chat/stream_chat.dart';
export 'src/channel_list_view.dart';
export 'src/message_input.dart';
export 'src/message_list_view.dart';
export 'src/message_widget.dart';