@@ -1,3 +1,7 @@
|
|||||||
|
## 0.2.13+2
|
||||||
|
|
||||||
|
- Add debounce to on change messageinput listener
|
||||||
|
|
||||||
## 0.2.13+1
|
## 0.2.13+1
|
||||||
|
|
||||||
- Use TextEditingController.addListener instead of TextField.onChanged
|
- Use TextEditingController.addListener instead of TextField.onChanged
|
||||||
|
|||||||
+51
-32
@@ -380,11 +380,19 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
Future<List<Member>> queryMembers;
|
Future<List<Member>> queryMembers;
|
||||||
|
|
||||||
if (query.isNotEmpty) {
|
if (query.isNotEmpty) {
|
||||||
queryMembers = StreamChannel.of(context).channel.queryMembers(filter: {
|
queryMembers = StreamChannel.of(context).channel.queryMembers(
|
||||||
'name': {
|
filter: {
|
||||||
'\$autocomplete': query,
|
'name': {
|
||||||
|
'\$autocomplete': query,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}).then((res) => res.members);
|
sort: [
|
||||||
|
SortOption(
|
||||||
|
'name',
|
||||||
|
direction: SortOption.ASC,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).then((res) => res.members);
|
||||||
}
|
}
|
||||||
|
|
||||||
final members = StreamChannel.of(context).channel.state.members?.where((m) {
|
final members = StreamChannel.of(context).channel.state.members?.where((m) {
|
||||||
@@ -421,7 +429,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
return ListView(
|
return ListView(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
children: snapshot.data
|
children: (snapshot.data ?? members)
|
||||||
.map((m) => ListTile(
|
.map((m) => ListTile(
|
||||||
leading: UserAvatar(
|
leading: UserAvatar(
|
||||||
user: m.user,
|
user: m.user,
|
||||||
@@ -930,7 +938,8 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
if (!kIsWeb) {
|
if (!kIsWeb) {
|
||||||
_keyboardListener = KeyboardVisibility.onChange.listen((visible) {
|
_keyboardListener =
|
||||||
|
KeyboardVisibilityController().onChange.listen((visible) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
_onChange();
|
_onChange();
|
||||||
} else {
|
} else {
|
||||||
@@ -952,37 +961,47 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timer _debounce;
|
||||||
void _onChange() {
|
void _onChange() {
|
||||||
final s = textEditingController.text;
|
if (_debounce?.isActive == true) _debounce.cancel();
|
||||||
StreamChannel.of(context).channel.keyStroke(
|
_debounce = Timer(
|
||||||
widget.parentMessage?.id,
|
const Duration(milliseconds: 350),
|
||||||
);
|
() {
|
||||||
|
if (!mounted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final s = textEditingController.text;
|
||||||
|
StreamChannel.of(context).channel.keyStroke(
|
||||||
|
widget.parentMessage?.id,
|
||||||
|
);
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_messageIsPresent = s.trim().isNotEmpty;
|
_messageIsPresent = s.trim().isNotEmpty;
|
||||||
});
|
});
|
||||||
|
|
||||||
_commandsOverlay?.remove();
|
_commandsOverlay?.remove();
|
||||||
_commandsOverlay = null;
|
_commandsOverlay = null;
|
||||||
_mentionsOverlay?.remove();
|
_mentionsOverlay?.remove();
|
||||||
_mentionsOverlay = null;
|
_mentionsOverlay = null;
|
||||||
|
|
||||||
if (s.trim().startsWith('/')) {
|
if (s.trim().startsWith('/')) {
|
||||||
_commandsOverlay = _buildCommandsOverlayEntry();
|
_commandsOverlay = _buildCommandsOverlayEntry();
|
||||||
Overlay.of(context).insert(_commandsOverlay);
|
Overlay.of(context).insert(_commandsOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_messageIsPresent &&
|
if (_messageIsPresent &&
|
||||||
textEditingController.selection.isCollapsed &&
|
textEditingController.selection.isCollapsed &&
|
||||||
textEditingController.selection.baseOffset > 0 &&
|
textEditingController.selection.baseOffset > 0 &&
|
||||||
textEditingController.text
|
textEditingController.text
|
||||||
.substring(0, textEditingController.selection.baseOffset)
|
.substring(0, textEditingController.selection.baseOffset)
|
||||||
.split(' ')
|
.split(' ')
|
||||||
.last
|
.last
|
||||||
.contains('@')) {
|
.contains('@')) {
|
||||||
_mentionsOverlay = _buildMentionsOverlayEntry();
|
_mentionsOverlay = _buildMentionsOverlayEntry();
|
||||||
Overlay.of(context).insert(_mentionsOverlay);
|
Overlay.of(context).insert(_mentionsOverlay);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _parseExistingMessage(Message message) {
|
void _parseExistingMessage(Message message) {
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
name: stream_chat_flutter
|
name: stream_chat_flutter
|
||||||
homepage: https://github.com/GetStream/stream-chat-flutter
|
homepage: https://github.com/GetStream/stream-chat-flutter
|
||||||
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
|
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
|
||||||
version: 0.2.13+1
|
version: 0.2.13+2
|
||||||
repository: https://github.com/GetStream/stream-chat-flutter
|
repository: https://github.com/GetStream/stream-chat-flutter
|
||||||
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
||||||
|
|
||||||
@@ -19,10 +19,10 @@ dependencies:
|
|||||||
flutter_markdown: ^0.5.0
|
flutter_markdown: ^0.5.0
|
||||||
url_launcher: ^5.4.11
|
url_launcher: ^5.4.11
|
||||||
video_player: ^1.0.0
|
video_player: ^1.0.0
|
||||||
chewie: ^0.10.4
|
chewie: ^0.12.0
|
||||||
file_picker: ^2.0.12
|
file_picker: ^2.0.12
|
||||||
image_picker: ^0.6.7+2
|
image_picker: ^0.6.7+2
|
||||||
flutter_keyboard_visibility: ^3.3.0
|
flutter_keyboard_visibility: ^4.0.1
|
||||||
stream_chat: ^0.2.13
|
stream_chat: ^0.2.13
|
||||||
mime: ^0.9.6+3
|
mime: ^0.9.6+3
|
||||||
visibility_detector: ^0.1.5
|
visibility_detector: ^0.1.5
|
||||||
|
|||||||
Reference in New Issue
Block a user