diff --git a/lib/src/annotation_editing_controller.dart b/lib/src/annotation_editing_controller.dart index 7df935b..787eaa9 100644 --- a/lib/src/annotation_editing_controller.dart +++ b/lib/src/annotation_editing_controller.dart @@ -55,7 +55,8 @@ class AnnotationEditingController extends TextEditingController { } @override - TextSpan buildTextSpan({BuildContext? context, TextStyle? style, bool? withComposing}) { + TextSpan buildTextSpan( + {BuildContext? context, TextStyle? style, bool? withComposing}) { var children = []; if (_pattern == null || _pattern == '()') { diff --git a/lib/src/mention_view.dart b/lib/src/mention_view.dart index ec8be89..ec118e2 100644 --- a/lib/src/mention_view.dart +++ b/lib/src/mention_view.dart @@ -7,6 +7,8 @@ class FlutterMentions extends StatefulWidget { this.defaultText, this.suggestionPosition = SuggestionPosition.Bottom, this.suggestionListHeight = 300.0, + this.suggestionListWidth = double.infinity, + this.suggestionListPadding = EdgeInsets.zero, this.onMarkupChanged, this.onMentionAdd, this.onSearchChanged, @@ -84,6 +86,14 @@ class FlutterMentions extends StatefulWidget { /// Defaults to `300.0` final double suggestionListHeight; + /// Max width for the suggestion list + /// + /// Defaults to `double.infinity` + final double suggestionListWidth; + + /// Suggestion list Padding + final EdgeInsets suggestionListPadding; + /// A Functioned which is triggered when ever the input changes /// but with the markup of the selected mentions /// @@ -412,79 +422,83 @@ class FlutterMentionsState extends State { : widget.mentions[0]; return Container( - child: PortalEntry( - portalAnchor: widget.suggestionPosition == SuggestionPosition.Bottom - ? Alignment.topCenter - : Alignment.bottomCenter, - childAnchor: widget.suggestionPosition == SuggestionPosition.Bottom - ? Alignment.bottomCenter - : Alignment.topCenter, - portal: ValueListenableBuilder( - valueListenable: showSuggestions, - builder: (BuildContext context, bool show, Widget? child) { - return show && !widget.hideSuggestionList - ? OptionList( - suggestionListHeight: widget.suggestionListHeight, - suggestionBuilder: list.suggestionBuilder, - suggestionListDecoration: widget.suggestionListDecoration, - data: list.data.where((element) { - final ele = element['display'].toLowerCase(); - final str = _selectedMention!.str - .toLowerCase() - .replaceAll(RegExp(_pattern), ''); - - return ele == str ? false : ele.contains(str); - }).toList(), - onTap: (value) { - addMention(value, list); - showSuggestions.value = false; - }, - ) - : Container(); - }, - ), - child: Row( - children: [ - ...widget.leading, - Expanded( - child: TextField( - maxLines: widget.maxLines, - minLines: widget.minLines, - maxLength: widget.maxLength, - focusNode: widget.focusNode, - keyboardType: widget.keyboardType, - keyboardAppearance: widget.keyboardAppearance, - textInputAction: widget.textInputAction, - textCapitalization: widget.textCapitalization, - style: widget.style, - textAlign: widget.textAlign, - textDirection: widget.textDirection, - readOnly: widget.readOnly, - showCursor: widget.showCursor, - autofocus: widget.autofocus, - autocorrect: widget.autocorrect, - maxLengthEnforcement: widget.maxLengthEnforcement, - cursorColor: widget.cursorColor, - cursorRadius: widget.cursorRadius, - cursorWidth: widget.cursorWidth, - buildCounter: widget.buildCounter, - autofillHints: widget.autofillHints, - decoration: widget.decoration, - expands: widget.expands, - onEditingComplete: widget.onEditingComplete, - onTap: widget.onTap, - onSubmitted: widget.onSubmitted, - enabled: widget.enabled, - enableInteractiveSelection: widget.enableInteractiveSelection, - enableSuggestions: widget.enableSuggestions, - scrollController: widget.scrollController, - scrollPadding: widget.scrollPadding, - scrollPhysics: widget.scrollPhysics, - controller: controller, + child: Padding( + padding: widget.suggestionListPadding, + child: PortalEntry( + portalAnchor: widget.suggestionPosition == SuggestionPosition.Bottom + ? Alignment.topCenter + : Alignment.bottomCenter, + childAnchor: widget.suggestionPosition == SuggestionPosition.Bottom + ? Alignment.bottomCenter + : Alignment.topCenter, + portal: ValueListenableBuilder( + valueListenable: showSuggestions, + builder: (BuildContext context, bool show, Widget? child) { + return show && !widget.hideSuggestionList + ? OptionList( + suggestionListHeight: widget.suggestionListHeight, + suggestionListWidth: widget.suggestionListWidth, + suggestionBuilder: list.suggestionBuilder, + suggestionListDecoration: widget.suggestionListDecoration, + data: list.data.where((element) { + final ele = element['display'].toLowerCase(); + final str = _selectedMention!.str + .toLowerCase() + .replaceAll(RegExp(_pattern), ''); + + return ele == str ? false : ele.contains(str); + }).toList(), + onTap: (value) { + addMention(value, list); + showSuggestions.value = false; + }, + ) + : Container(); + }, + ), + child: Row( + children: [ + ...widget.leading, + Expanded( + child: TextField( + maxLines: widget.maxLines, + minLines: widget.minLines, + maxLength: widget.maxLength, + focusNode: widget.focusNode, + keyboardType: widget.keyboardType, + keyboardAppearance: widget.keyboardAppearance, + textInputAction: widget.textInputAction, + textCapitalization: widget.textCapitalization, + style: widget.style, + textAlign: widget.textAlign, + textDirection: widget.textDirection, + readOnly: widget.readOnly, + showCursor: widget.showCursor, + autofocus: widget.autofocus, + autocorrect: widget.autocorrect, + maxLengthEnforcement: widget.maxLengthEnforcement, + cursorColor: widget.cursorColor, + cursorRadius: widget.cursorRadius, + cursorWidth: widget.cursorWidth, + buildCounter: widget.buildCounter, + autofillHints: widget.autofillHints, + decoration: widget.decoration, + expands: widget.expands, + onEditingComplete: widget.onEditingComplete, + onTap: widget.onTap, + onSubmitted: widget.onSubmitted, + enabled: widget.enabled, + enableInteractiveSelection: widget.enableInteractiveSelection, + enableSuggestions: widget.enableSuggestions, + scrollController: widget.scrollController, + scrollPadding: widget.scrollPadding, + scrollPhysics: widget.scrollPhysics, + controller: controller, + ), ), - ), - ...widget.trailing, - ], + ...widget.trailing, + ], + ), ), ), ); diff --git a/lib/src/option_list.dart b/lib/src/option_list.dart index 5c1439a..bedfd91 100644 --- a/lib/src/option_list.dart +++ b/lib/src/option_list.dart @@ -5,6 +5,7 @@ class OptionList extends StatelessWidget { required this.data, required this.onTap, required this.suggestionListHeight, + required this.suggestionListWidth, this.suggestionBuilder, this.suggestionListDecoration, }); @@ -17,6 +18,8 @@ class OptionList extends StatelessWidget { final double suggestionListHeight; + final double suggestionListWidth; + final BoxDecoration? suggestionListDecoration; @override @@ -26,9 +29,10 @@ class OptionList extends StatelessWidget { decoration: suggestionListDecoration ?? BoxDecoration(color: Colors.white), constraints: BoxConstraints( - maxHeight: suggestionListHeight, - minHeight: 0, - ), + maxHeight: suggestionListHeight, + maxWidth: suggestionListWidth, + minHeight: 0, + minWidth: 0), child: ListView.builder( itemCount: data.length, shrinkWrap: true, diff --git a/pubspec.lock b/pubspec.lock index af9486f..d6c5471 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,51 +5,50 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" + version: "1.3.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.17.2" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -59,7 +58,8 @@ packages: dependency: "direct main" description: name: flutter_portal - url: "https://pub.dartlang.org" + sha256: "0e3f9428dbe9f5253b0e65cdc5ce4fa65a1d8cd6ec2a3f3770b46785aa3c57fd" + url: "https://pub.dev" source: hosted version: "0.4.0" flutter_test: @@ -71,23 +71,34 @@ packages: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" source: hosted - version: "0.12.10" + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.9.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.8.3" sky_engine: dependency: transitive description: flutter @@ -97,58 +108,66 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + url: "https://pub.dev" source: hosted - version: "0.3.0" - typed_data: + version: "0.6.0" + vector_math: dependency: transitive description: - name: typed_data - url: "https://pub.dartlang.org" + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "1.3.0" - vector_math: + version: "2.1.4" + web: dependency: transitive description: - name: vector_math - url: "https://pub.dartlang.org" + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "0.1.4-beta" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=1.21.0"