fix: Multiline keyboard on web and desktop

This commit is contained in:
Christian Pauly 2021-05-28 22:44:20 +02:00
parent e300048d3b
commit f9bec90f3d
2 changed files with 76 additions and 39 deletions

View File

@ -668,11 +668,9 @@ class ChatView extends StatelessWidget {
child: InputBar(
room: controller.room,
minLines: 1,
maxLines: kIsWeb ? 1 : 8,
maxLines: 8,
autofocus: !PlatformInfos.isMobile,
keyboardType: !PlatformInfos.isMobile
? TextInputType.text
: TextInputType.multiline,
keyboardType: TextInputType.multiline,
onSubmitted:
controller.onInputBarSubmitted,
focusNode: controller.inputFocus,

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/services.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'avatar.dart';
@ -263,7 +264,37 @@ class InputBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TypeAheadField<Map<String, String>>(
return Shortcuts(
shortcuts: {
LogicalKeySet(LogicalKeyboardKey.shift, LogicalKeyboardKey.enter):
NewLineIntent(),
LogicalKeySet(LogicalKeyboardKey.enter): SubmitLineIntent(),
},
child: Actions(
actions: {
NewLineIntent: CallbackAction(onInvoke: (i) {
final val = controller.value;
final selection = val.selection.start;
final messageWithoutNewLine =
controller.text.substring(0, val.selection.start) +
'\n' +
controller.text.substring(val.selection.start);
controller.value = TextEditingValue(
text: messageWithoutNewLine,
selection: TextSelection.fromPosition(
TextPosition(offset: selection + 1),
),
);
return null;
}),
SubmitLineIntent: CallbackAction(onInvoke: (i) {
if (PlatformInfos.kIsWeb || PlatformInfos.isDesktop){
onSubmitted(controller.text);
}
return null;
}),
},
child: TypeAheadField<Map<String, String>>(
direction: AxisDirection.up,
hideOnEmpty: true,
hideOnLoading: true,
@ -281,9 +312,10 @@ class InputBar extends StatelessWidget {
// it sets the types for the callback incorrectly
onSubmitted(text);
},
focusNode: focusNode,
//focusNode: focusNode,
controller: controller,
decoration: decoration,
focusNode: focusNode,
onChanged: (text) {
// fix for the library for now
// it sets the types for the callback incorrectly
@ -292,7 +324,8 @@ class InputBar extends StatelessWidget {
textCapitalization: TextCapitalization.sentences,
),
suggestionsCallback: getSuggestions,
itemBuilder: (c, s) => buildSuggestion(c, s, Matrix.of(context).client),
itemBuilder: (c, s) =>
buildSuggestion(c, s, Matrix.of(context).client),
onSuggestionSelected: (Map<String, String> suggestion) =>
insertSuggestion(context, suggestion),
errorBuilder: (BuildContext context, Object error) => Container(),
@ -300,6 +333,12 @@ class InputBar extends StatelessWidget {
Container(), // fix loading briefly flickering a dark box
noItemsFoundBuilder: (BuildContext context) =>
Container(), // fix loading briefly showing no suggestions
),
),
);
}
}
class NewLineIntent extends Intent {}
class SubmitLineIntent extends Intent {}